Как передать параметр в valueChangeListener в p: dataTable? - PullRequest
3 голосов
/ 05 декабря 2011

Я звоню valueChangeListener на <h:selectBooleanCheckbox>, который находится внутри dataTable. и этот dataTable снова находится внутри другого (внешнего) dataTable. В методе valueChangeListener я хочу экземпляр объекта внешнего dataTable. Есть ли способ получить объект внешнего экземпляра dataTable?

EX:

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

Я нашел следующее решение: я использовал <p:ajax> listener вместо valueChangeListener, и я мог передать объект 'supplier' и объект supplierAccount этому методу listener. Мы можем передать любое количество пользовательских объектов слушателю <p:ajax>.

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

Ответы [ 2 ]

6 голосов
/ 05 декабря 2011

В данном конкретном случае вы можете получить его, оценив #{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,Он срабатывает только при каждом втором клике.Вы скорее хотите использовать onclick="submit()" вместо.

0 голосов
/ 05 декабря 2011

Я вижу, что вы забыли фигурную скобку ({) как раз перед bean:

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

Кроме того, поскольку вы используете Primefaces, вы можете использовать его компоненты (что, если вы используете версию 3): http://www.primefaces.org/showcase-labs/ui/selectBooleanCheckbox.jsf

Нет необходимости использовать outputText, если вы используете jsf 2:

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

Также нет необходимости использовать f:facet, поскольку компонент columnимеет атрибут headerText:

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

Так намного проще, не правда ли?

PS: Что это?value="supplier.supplierAccountList" Нет # {}?

...