【问题标题】:p:commandButton inside p:dataTable/p:dataGrid/p:dataList in primefaces/jsfp:commandButton inside p:dataTable/p:dataGrid/p:dataList in primefaces/jsf
【发布时间】:2013-02-18 06:23:45
【问题描述】:

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

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

注意 dataGrid 是延迟加载的。

请找到示例代码:

    <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;
  }

我在 glassfish 3.1.2.2、primefaces 3.4、mojarra 上运行

谢谢。

【问题讨论】:

  • 你能显示支持bean的代码,至少相关部分(这两个方法,以及带注释的类定义)吗?
  • 能否将支持 bean 的范围更改为 viewscoped 或 sessionscoped?

标签: java jsf primefaces glassfish


【解决方案1】:

当迭代组件中的命令组件被调用时,JSF 将在处理表单提交期间重复迭代组件以找到被调用的命令。为了成功找到它,它要求value="#{controller.values}"rendered="#{controller.hasValues()}" 在处理表单提交期间评估完全相同 与显示表单期间所做的相同。

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

所以,为了解决这个问题,您只需要确保getValues()isHasValues() 在处理表单提交过程中返回的值与显示表单过程中返回的值完全相同。一种简单的方法是将 bean 放在视图范围内(并确保您没有在 getter 方法中执行业务逻辑,而只是在(post)构造函数和(action)listener 方法中)。

另见:

【讨论】:

  • 我已经意识到,如果我将 DataModel 从 LazyDataModel 更改为 ListDataModel,它可以正常工作。如何提供这种一致性?我在会话范围 bean 的 post 构造方法中初始化 LazyDataModel
猜你喜欢
  • 1970-01-01
  • 2014-05-14
  • 2013-05-22
  • 2013-06-27
  • 2011-10-09
  • 2011-05-31
  • 1970-01-01
  • 2013-01-14
  • 2014-12-02
相关资源
最近更新 更多