PrimeFaces selectors ( [〜#〜] pfs [〜#〜] )の仕組みがわかりません。
<h:outputText value="#{bean.text1}" styleClass="myClass" />
<p:commandButton update="@(.myClass)" />
使用できます。そして、私にとっては常に機能するとは限りませんが、素晴らしいツールだと思います。 .myClass
はクライアント側のjQueryセレクターです。サーバー側のJSFはどのように更新するのかを知っていますか?
通常の JSF IDセレクター の動作を理解できます。
<h:outputText value="#{bean.text1}" id="textId" />
<p:commandButton update="textId" />
textId
は、サーバー側のXHTMLファイルで定義されているコンポーネントツリーのコンポーネントのIDを参照します。そのため、JSFが適切なコンポーネントを見つける方法を理解できます。
ただし、primefacesセレクターを使用している場合は、クライアント側のjQueryセレクターが使用されます。 JSFは、どのコンポーネントを更新する必要があるかをどのように知るのですか? PFSに問題がある場合があります。私にはいつも機能するとは限りません。 PFSを使用している場合に留意すべきことはありますか?
PrimeFacesがjQueryを使用していることをご存知でしょう。 PrimeFaces SelectorsはjQueryに基づいています。 @(...)
で指定したものはすべて、現在のHTML DOMツリーでjQueryセレクターとして使用されます。 IDを持つHTML要素が見つかった場合、最終的には正確にこのIDがupdate
で使用されます。
基本的に、update="@(.myclass)"
の場合、PrimeFacesはおおまかにこれを行います。
_var $elements = $(".myclass");
var clientIds = [];
$.each($elements, function(index, element) {
if (element.id) {
clientIds.Push(":" + element.id);
}
});
var newUpdate = clientIds.join(" "); // This will be used as `update` instead.
_
だから、例えば.
_<h:form id="formId">
<h:outputText id="output1" styleClass="myclass" ... />
<h:outputText styleClass="myclass" ... />
<h:outputText id="output3" styleClass="myclass" ... />
</h:form>
_
このコマンドボタンの更新
_<p:commandButton ... update="@(.myclass)" />
_
とまったく同じ効果になります
_<p:commandButton ... update=":formId:output1 :formId:output3" />
_
これは、自動生成されたIDでも機能することに注意してください。つまり_<h:form id>
_は必須ではありません。
時々PFSに問題があります。 PFSを使用している場合に留意すべきことはありますか?
「多すぎる」を選択した場合があります(たとえば、@(form)
は現在のフォームを選択しませんが、allフォームはまったく同じです。 $("form")
jQuery!)、または実際に何も選択しなかったこと(目的のHTML DOM要素に実際にIDがない場合)。 HTML DOMツリーの要素IDとHTTPトラフィックモニターのリクエストペイロードを調べると、手がかりが得られます。
HTML DOMツリーの目的の要素mustには(自動生成された)IDがあります。 HTTPトラフィックモニターの_javax.faces.partial.render
_要求パラメーターmustには正しいクライアントIDが含まれています。 JSFコンポーネントツリーの要素のrendered
属性must更新時にtrue
を評価します。等。
特定の例では、_<h:outputText>
_は、IDを含む生成されたHTML出力にはなりません。 id
を割り当てると、更新に関する問題を解決できます。
したがって、この例は機能しません
_<h:form>
<h:outputText value="#{bean.text1}" styleClass="myClass" />
<p:commandButton value="Update" update="@(.myClass)" />
</h:form>
_
ただし、この例は機能します(フォームにIDを割り当てる必要はありません)。
_<h:form>
<h:outputText id="myText" value="#{bean.text1}" styleClass="myClass" />
<p:commandButton value="Update" update="@(.myClass)" />
</h:form>
_