首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >p:commandButton in p:dataTable/p:dataGrid/p:dataList in primefaces/jsf

p:commandButton in p:dataTable/p:dataGrid/p:dataList in primefaces/jsf
EN

Stack Overflow用户
提问于 2013-02-18 06:23:45
回答 1查看 3.3K关注 0票数 0

我在p:dataGrid中有一个p:commandButton (我还尝试了p:dataTable,p:dataList)

未执行命令按钮动作侦听器方法,但对服务器进行ajax调用。

请注意,dataGrid是延迟加载的。

请查找示例代码:

代码语言:javascript
复制
    <p:dataGrid id="portfolioView" value="#{controller.values}" var="p"
                      lazy="true" rendered="#{controller.hasValues()}"
                      style="width: 100%" paginator="true"  rows="20" columns="1">
            <p:column id="portfolioViewColumn">
              <h:panelGroup id="portfolioPanel" layout="block"
                            style="width: 95%; padding: 20px; margin-bottom: 5px; margin-top: 5px; border-radius: 5px"
                            styleClass="importantpanel_down_less_spread">
                <h:panelGrid columns="3" >
                  <p:graphicImage value="#{controller.photo}" width="60" height="60"/>
                  <h:panelGroup layout="block" style="width: 100%" >
                    <h:outputText value="#{controller.user.name}" style="font-weight: bold; font-size: 12px"/>
                    <br/>
                    <h:outputText value="#{p.dateString}"
                                  style="font-weight: bold; font-size: 12px; color: #454545/>
                    <br/>
                    <h:outputText value="#{p.portfolioTitle}"
                                  style="font-weight: bold; font-size: 14px; color: #454545"/>
                  </h:panelGroup>
                  <h:panelGroup layout="block" >
                    <h:form>
                    <p:commandButton icon="ui-icon-trash" id="deletePortfolio" value="Delete" title="Delete this portfolio"
                                     styleClass="fs-button-portfolio" actionListener="#{controller.deleteValue(p)}"/>
                    <p:commandButton icon="ui-icon-pencil" id="editPortfolio" value="Edit" title="Edit this portfolio"
                                     styleClass="fs-button-portfolio" actionListener="#{controller.editValue(p)}" />
                  </h:form>
                  </h:panelGroup>
                </h:panelGrid>
    </p:column>
    <p:dataGrid>

public void deleteValue(Portfolio portfolio) {
    try {
      System.out.println("Removing portfolio ...");
      portfolioFacade.remove(portfolio);
      JsfUtil.addSuccessMessage("Portfolio Removed", "You have deleted a portfolio from your timeline");
    } catch (Exception e) {
      JsfUtil.addErrorMessage("Failure", "Sorry! We have failed to remove this portfolio from your timeline.");
    }
  }

public void editValue(Portfolio portfolio) {
      System.out.println("Preparing portfolio edit...");
      this.currentPortfolio = portfolio;
  }

我用的是玻璃鱼3.1.2.2,PrimeFaces3.4,mojarra

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2013-02-18 11:34:28

当调用迭代组件中的命令组件时,JSF将在处理表单提交时对迭代组件进行重复,以查找正在调用的命令。为了成功地找到它,它要求value="#{controller.values}"rendered="#{controller.hasValues()}"在处理表单提交时与显示表单时完全相同地计算

您的具体问题表明它没有。如果getValues()返回一个不兼容的更改列表(即bean是请求作用域,并且没有根据请求参数保留列表),或者如果isHasValues()返回false,那么JSF将无法在其上重申,因此也无法找到正在调用的命令。

因此,为了解决这个问题,您只需要确保getValues()isHasValues()在处理表单提交时返回的值与显示表单时的返回值完全相同。一种简单的方法是将bean放在视图作用域中(并且绝对确保您不是在getter方法中执行业务逻辑,而是只在(Post)构造函数和(Action)侦听器方法中执行业务逻辑)。

另请参阅:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14930600

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档