0

我正在尝试让 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>

这是第一次工作,在面板第一次更新后它停止更新模型并且监听器也没有被调用。然而,渲染被触发,导致旧值被显示。

现在,当我用 f:ajax 替换 a4j:ajax 时,我收到错误消息,即在 xyzInput 中找不到 id xyzPG。

<f:ajax event="change" render="@this" listener="#{listener.doSomeStuff}" />

当我尝试将重新渲染限制为 inputText 时,它总是会更新模型并调用侦听器,但是不会重新渲染 h:inputText。

我已经尝试在 inputText 周围放置另一个 panelGroup ,但这也不起作用。

我们不使用 h:dataTable 的原因是我们必须生成一个具有以下布局的表:

---------------------------- 
| dataSet1     | dataSet 2 |
----------------------------
| dataSet3     | dataSet 4 |
etc...

因此我们使用 ui:repeat 的 offset 和 step 属性。

4

2 回答 2

1
  1. 按照设计,您不能id使用渲染时标签动态生成属性,例如<ui:repeat/>
  • 编译时 V 渲染时标签

    出于视图构造和 ajax 更新的目的,id组件的 s 在视图构造期间必须在视图呈现之前可用。<ui:repeat/>已经满足了它的子组件的唯一性。但是,如果您需要控制 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/>
    
  1. 您不太可能xyzPG从内部访问,<ui:repeat/>因为<ui:repeat/>它也是一个命名容器,就像<h:panelGrid/>等等。ajax 更新适用于 Richfaces,因为它们为此类用例做出了特殊规定。<f:ajax/>然而不会容忍它。xyzPG超出了<ui:repeat/>so 要访问该组件的范围,您需要使用合格的命名约定:

      <f:ajax event="change" render=":form1:xyzPG" listener="#{listener.doSomeStuff}"/>
    

这假设它xyzPG直接包含在一个<h:form id="form1"/>

于 2013-08-16T21:11:02.220 回答
-1

没有看到你的支持 bean 代码,我认为你应该使用

<h:inputText id="#{idController.idXYZ}"

代替

<h:inputText id="#{idController.getIdXYZ()}" 
于 2013-08-14T15:46:13.307 回答