JSF Ajax在Change </h:textinput>上重新呈现<h:textinput ... =“”>

时间:2013-08-14 14:41:18

标签: jsf jsf-2

我试图让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的偏移和步骤属性。

2 个答案:

答案 0 :(得分:1)

  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/>
    
  2. 您不可能在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()}"