如何使用Ajax reRender由dataTable动态生成的inputText

时间:2014-09-22 17:13:47

标签: ajax jsf jsf-1.2

我在我的项目JSF 1.2和标签<a4j:support>中使用此处。

好吧,我在这里使用<h:dataTable />在屏幕上打印一份财务费用清单,用户可以随时插入新费用或编辑现有费用,这些费用字段的值(金额,余额,价值)显示在inputTexts组件中。

当我使用<h:dataTable />时,它的inputTexts会自动生成,因此它会创建具有动态id的动态inputTexts。我看了一下页面的html源代码,JSF用于动态生成id的模式是这样的:

id="formTemplate:tableForm:0:inputTextValue" ;
id="formTemplate:tableForm:1:inputTextValue" ;
id="formTemplate:tableForm:2:inputTextValue"

在xhtml页面中,我与dataTable一起使用的代码是:

<h:inputText id="inputTextValue" value="#{item.value}" label="Value" styleClass="field" size="9" readonly="true" dir="RTL" style="font-size:12px;width:170px">

我的业务规则的工作原理如下:当用户在inputTextBalance中键入内容时,它会调用事件onBlur,它会自动在字段中插入另一个值&#34; value&#34;,但要更新此inputTextValue,我需要在我的面板(panelDataTable)中执行reRender,因此它reRender整个dataTable(dataTable在Panel中)。

    <h:inputText id="inputTextBalance" value="#{item.balance}" dir="RTL">
      <f:convertNumber currencyCode="BRL" type="currency" />
        <a4j:support  event="onblur" reRender="panelDataTable" ajaxSingle="true" action="#{expenses.update}"/>                                                  
   </h:inputText>

现在遇到了麻烦,我需要做的只是reRender只有inputTextValue而不是面板,但这些字段是动态生成的,我无法得到它们。就像我之前说的那样,这是JSF用来生成字段id的模式

id="formTemplate:tableForm:0:inputTextValue" ;
id="formTemplate:tableForm:1:inputTextValue" ;
id="formTemplate:tableForm:2:inputTextValue"

但是当我在reRender属性中使用任何这些id时,Ajax的日志会返回以下消息:

18:23:57,208 WARN [AjaxContext] Target component for id formTemplate:tableForm:0:inputTextValue not found

我试过了,但我收到了同样的错误消息:reRender="#{rich:clientId('inputTextValue')}"

这里最奇怪的是它向我显示了未找到输入的这条消息,但是在html源代码中,他输入文本的id与​​我对reRender的内容相同。

这里有人已经解决了这个问题吗?对我有什么建议吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

你应该将h:dataTable绑定到bean中的变量,以便到达当前行索引。

<h:dataTable binding="#{myManagedBean.dataTable}" ...>

然后您可以像这样更改a4j:support

<a4j:support reRender="formTemplate:tableForm:#{myManagedBean.dataTable.rowIndex}:inputTextValue" ... />