设置来自辅助bean的相互依赖字段的值

时间:2014-07-09 16:20:01

标签: jsf primefaces jsf-2.2 mojarra

我使用的是JSF 2.2(Mojarra),PrimeFaces 4,Tomcat 7 我在ui中有两个相互依赖的自动完成字段:重复。当我在第一个自动完成中选择某些内容时,我需要设置第二个自动完成的值,反之亦然。

<ui:repeat var="anItem" value="#{aBean.itemList}" varStatus="status">
    <p:inputText id="someId1" value="anItem.operation" required="true"/>

    <p:autoComplete id="nature" dropdown="true" forceSelection="true" value="#{anItem.nature}" completeMethod="#{myController.completeNatureList}">
        <p:ajax event="itemSelect" listener="#{myController.selectNature(status.index)}" process="@this" update="code"/>
    </p:autoComplete>
    <p:autoComplete id="code" dropdown="true" forceSelection="true" value="#{anItem.code}" completeMethod="#{myController.completeCodeList}">
        <p:ajax event="itemSelect" listener="#{myController.selectCode(status.index)}" process="@this" update="nature"/>
    </p:autoComplete>
</ui:repeat>

我的豆子

@ManagedBean(name = "aBean")
@ViewScoped
public class Bean implements Serializable {

    List<Item> itemList;

    // getter and setter
}

public class Item implements Serializable {

    private String operation;
    private String nature;
    private String code;

    // getter and setter
}

我的控制器看起来像这样:

@ManagedBean(name = "myController")
@ViewScoped
public class Controller implements Serializable {


    @ManagedProperty(value = "#{aBean}")
    private Bean aBean;

    @Override
    public void selectNature(final int pIndex) {
        LOGGER.debug("Nature selected");
        // business logic
        this.aBean.getItemList().get(pIndex).setCode("code from business logic");
    }

    @Override
    public void selectCode(final int pIndex) {
        LOGGER.debug("Code selected");
        // business logic
        this.aBean.getItemList().get(pIndex).setNature("nature from business logic");
    }
}

我第一次在第一次自动填充中选择某些内容时,它运行正常。但是,如果我在第二个自动填充中选择了某些内容,则我的第一个自动填充功能不会更新。如果我在第一个自动填充中重新选择了某些内容,则此功能不再适用。日志告诉我我的控制器总是被调用。

我尝试更新整个表单并且每次都有效,但我当然负担不起,因为我的表单中包含所有必填字段。

<p:ajax event="itemSelect" listener="#{myController.selectNature(status.index)}" process="@this" update="@form"/>

所以我的模型正确更新,问题似乎是渲染阶段已经处理过的字段的更新。

我不希望找到解决办法,因为我有很多类似的案例。我想理解为什么JSF表现得像这样,我做错了什么,知道为什么?

修改

看看这篇文章How to address a component inside a looping naming container,我尝试使用c:foreach而不是ui:repeat,它有效!

所以现在我想了解为什么我的旧解决方案使用ui:repeat只能使用一次。

0 个答案:

没有答案