我试图让h:textInput在变化时重新渲染,我用a4j尝试了它:ajax和f:ajax。
使用a4j时:ajax:
<h:panelGroup id="xyzPG">
<ui:repeat var="var" ... >
...
<h:inputText id="#{idController.getIdXYZ(var.id)}"
value="#{someModel.value}"
size="3"
styleClass="#{errorController.getErrorStateStyleId(idController.getIdXYZ())}">
<a4j:ajax event="change" render="xyzPG" listener="#{listener.doSomeStuff}" />
</h:inputText>
...
</ui:repeat>
</h:panelGroup>
这是第一次,在面板第一次更新后,它停止更新modell并且也没有调用监听器。但是,触发渲染会导致显示旧值。
现在当我用f:ajax替换a4j:ajax时,我收到错误消息,指出在xyzInput中找不到id xyzPG。
<f:ajax event="change" render="@this" listener="#{listener.doSomeStuff}" />
当我尝试将rerender限制为inputText时,它总是更新模型并调用侦听器,但是h:inputText不会被重新呈现。
我已经尝试在inputText周围放置另一个panelGroup,但这也不起作用。
我们之所以不使用h:dataTable是因为我们必须生成一个具有以下布局的表:
----------------------------
| dataSet1 | dataSet 2 |
----------------------------
| dataSet3 | dataSet 4 |
etc...
因此我们使用ui:repeat的偏移和步骤属性。
答案 0 :(得分:1)
按照设计,您无法使用像id
<ui:repeat/>
个属性
出于视图构造和ajax更新的目的,在呈现视图之前,视图构造期间必须可以使用id
个组件。 <ui:repeat/>
已经满足了它的子组件的ID的唯一性。但是如果你需要控制id,你需要使用像<c:forEach/>
这样的编译时标记处理程序:
<c:forEach items="#{idController.itemsList}" var="theVar">
<h:inputText id="#{idController.getIdXYZ(theVar.id)}" value="#{someModel.value}" size="3" styleClass="#{errorController.getErrorStateStyleId(idController.getIdXYZ())}">
<a4j:ajax event="change" render="xyzPG" listener="#{listener.doSomeStuff}" />
</h:inputText>
<c:forEach/>
您不可能在xyzPG
内与<ui:repeat/>
联系,因为<ui:repeat/>
也是一个命名容器,就像<h:panelGrid/>
一样等等。 ajax更新与Richfaces一起使用,因为他们已经为这些用例做了特殊规定。 <f:ajax/>
但是不会容忍它。 xyzPG
超出了<ui:repeat/>
的范围,因此要访问该组件,您需要使用合格的命名约定:
<f:ajax event="change" render=":form1:xyzPG" listener="#{listener.doSomeStuff}"/>
这假定xyzPG
直接包含在<h:form id="form1"/>
答案 1 :(得分:-1)
没有看到你的支持bean代码,我认为你应该使用
<h:inputText id="#{idController.idXYZ}"
而不是
<h:inputText id="#{idController.getIdXYZ()}"