【问题标题】:How to pass parameter to valueChangeListener in p:dataTable?如何将参数传递给 p:dataTable 中的 valueChangeListener?
【发布时间】:2012-01-13 00:46:01
【问题描述】:

我在数据表内的<h:selectBooleanCheckbox> 上调用valueChangeListener。并且该数据表再次位于另一个(外部)数据表中。在valueChangeListener 方法中,我想要外部数据表的实例对象。有没有办法获取外部dataTable实例的对象?

前:

<h:panelGroup id="panelId">
    <p:dataTable id="outerDatatable"
                 var="supplier"
                 value="bean.supplierList">

        <p:column>
            <f:facet name="header">
                <h:outputText value="Suppliers" />
            </f:facet>
            <h:outputText value="#{supplier.name}" />
        </p:column>

        <p:column>
            <p:dataTable id="innerDataTable"
                         var="supplierAccount"
                         value="supplier.supplierAccountList">

                <p:column>
                    <h:selectBooleanCheckbox id="booleanBoxId"
                                             value="#{supplierAccount.supported}"
                                             valueChangeListener="#bean.checkBoxListener}"
                                             immediate="true"
                                             onchange="this.form.submit();"/>
                </p:column>
            </p:dataTable>
        </p:column>
    </p:dataTable>
</h:panelGroup>

我找到了以下解决方案:我使用&lt;p:ajax&gt; 侦听器而不是valueChangeListener,并且可以将“供应商”对象以及supplierAccount 对象传递给此侦听器方法。我们可以将任意数量的自定义对象传递给&lt;p:ajax&gt; 监听器。

<p:column>
    <h:selectBooleanCheckbox id="booleanBoxId"
                             value="#{supplierAccount.supported}"
                             immediate="true">
    </h:selectBooleanCheckbox>

    <p:ajax listener="#{bean.myListenerMethod(supplier,supplierAccount)}"
            update=":formName:panelId"/>
</p:column>

【问题讨论】:

    标签: jsf jsf-2 primefaces parameter-passing valuechangelistener


    【解决方案1】:

    我发现您在 bean 之前忘记了一个大括号 ({):

    valueChangeListener="#{bean.checkBoxListener}" immediate="true" 
    

    另外,由于您使用的是 Primefaces,您可以使用它的组件(如果您使用版本 3):http://www.primefaces.org/showcase-labs/ui/selectBooleanCheckbox.jsf

    如果使用jsf 2,则不需要使用outputText:

    <f:facet name="header">   
      Suppliers  
    </f:facet>   
    

    也没有必要使用f:facet,因为column 组件有一个名为headerText 的属性:

    <p:column headerText="Suppliers">
        #{supplier.name}"
    </p:column>
    

    这样就简单多了,不是吗?

    PS:这是什么? value="supplier.supplierAccountList" 没有#{ }?

    【讨论】:

    • 感谢您的回复。我最近听说了属性“headerText”,但我将不得不使用 n e 方式作为我项目中使用的常用格式。关于 value="supplier.supplierAccountList" ,它的 value="#{supplier.supplierAccountList}" 仅在我的代码中。在此处复制代码时错过了大括号。
    • @amruta 对话,如“谢谢 ..”、“你好 ..”等形式没有得到很好的接受。事实上,它们被认为是垃圾邮件。
    • @drunkMonk 让这个人感谢 :) 至少 hello 确实是垃圾邮件
    【解决方案2】:

    在这种特殊情况下,您可以通过以编程方式评估 #{supplier} 来获得它:

    public void checkBoxListener(ValueChangeEvent event) {
        FacesContext context = FacesContext.getCurrentInstance();
        Supplier supplier = context.getApplication().evaluateExpressionGet(context, "#{supplier}", Supplier.class);
        // ...
    }
    

    但是,这很丑陋,您正在通过onchange="submit()" 同步提交整个表单。我建议为此投入一些ajax。

    <h:selectBooleanCheckbox value="#{supplierAccount.supported}">
        <f:ajax listener="#{bean.checkBoxListener}" render="???" />
    </h:selectBooleanCheckbox>
    

    render 属性由你决定)

    public void checkBoxListener(AjaxBehavior event) {
        Boolean value = (Boolean) ((UIInput) event.getComponent()).getValue();
        FacesContext context = FacesContext.getCurrentInstance();
        Supplier supplier = context.getApplication().evaluateExpressionGet(context, "#{supplier}", Supplier.class);
        // ...
    }
    

    或者如果您的环境支持 EL 2.2 并因此在 EL 中指定方法参数:

    <h:selectBooleanCheckbox value="#{supplierAccount.supported}">
        <f:ajax listener="#{bean.checkBoxListener(component, supplier)}" render="???" />
    </h:selectBooleanCheckbox>
    
    public void checkBoxListener(UISelectBoolean checkbox, Supplier supplier) {
        boolean selected = checkbox.isSelected();
        // ...
    }
    

    另见:


    与具体问题无关,关于使用onchange="submit()",知道onchange 在IE6/7 中不能按预期工作可能很有用。它只会在每 2 次点击时触发。你宁愿改用onclick="submit()"

    【讨论】:

      猜你喜欢
      • 2011-04-26
      • 2018-09-30
      • 2020-10-09
      • 2012-12-21
      • 2012-01-07
      • 2014-05-03
      • 2015-06-26
      • 2012-01-18
      • 2017-07-14
      相关资源
      最近更新 更多