Tomcat 7.0.22.0 で Primefaces 3.3.1 を使用しています。p:inputText を含む p:dataTable があります。その p:dataTable の ID は「houseTabID:tabView:form0:table」です。HTMLソースからのコピペです。そして、p:dataTable のボタンでダイアログ (dataTable が存在するフォームの外側にあります) を開き、そのダイアログの p:commandButton で dataTable を更新します。
p:commandButton は次のようになります。
<p:commandButton ajax="true" action="#{myBean.setInputText()}"
value="OK"
update="#{myBean.getUpdateTarget(0)}"/>
myBean.getUpdateTarget(0) は、ターゲット コンポーネントを指す適切な文字列を再実行します。
「houseTabID:tabView:form0:table」を指定することで、dataTable 全体を正常に更新できます (myBean.getUpdateTarget(0) がその文字列を返すことを意味します)。しかし、テーブルに多くの行があるため、テーブル全体の更新が完了するまでに時間がかかり、スクロール位置がリセットされて本当にイライラします。そのため、テーブル全体ではなく、1 行だけを更新したいと思います。
そこで、まず「houseTabID:tabView:form0:table:inputBox」を返して、更新したいp:inputTextを更新しました。p:dataTable には、次のようなものがあります。
<p:column headerText="Value"
width="300" style="height:16px; font-size:9pt;">
<p:inputText id="inputBox" value="#{myItem.value}"
style="width:95%; height:11px; font-size:9pt;">
<f:ajax execute="@this" event="blur" />
</p:inputText>
</p:column>
結果: 更新なし、エラー ログなし。「houseTabID:tabView:form0:table:inputBox」は、テーブルの行を指定していないため、機能しないことがわかっています。そこでrowIndexVarを使って、rowIndexVarから:0:部分を作って「houseTabID:tabView:form0:table:0:inputBox」でやってみました。文字列は HTML ソースからコピーして貼り付けます。しかし、残念ながら、私は例外を得ました。
javax.faces.FacesException: Cannot find component with identifier ":houseTabID:tabView:form0:table:0:inputBox" referenced from "houseTabID:j_idt181:j_idt186".
なんで?明らかに「houseTabID:tabView:form0:table:0:inputBox」があり、HTML ソースで確認できます。「houseTabID:tabView:form0:table」でタルベ全体を更新できますが、「houseTabID:tabView:form0」で例外をスローします。 :table:0:inputBox"? 私には意味がありません。また、「houseTabID:tabView:form0:table:inputBox」で例外をスローしたり、エラーログを流出させたりしないのはなぜですか? その p:commandButton; の HTML ソースを確認しました。
onclick="PrimeFaces.ab({source:'houseTabID:j_idt190:j_idt195',update:'houseTabID:tabView:form0:table:inputBox',
p:dataTable全体ではなく、1行だけを更新したいのです。私を助けてください。