PrimeFacesselect器如何在update =“@(。myClass)”中工作?

我不明白PrimeFacesselect器 ( PFS )是如何工作的。

<h:outputText value="#{bean.text1}" styleClass="myClass" /> <p:commandButton update="@(.myClass)" /> 

我可以使用它。 而且我认为这是一个很棒的工具,虽然它并不总是为我工作。 .myClass是客户端的jQueryselect器。 服务器端的JSF如何知道要更新什么?

我可以理解普通的JSF IDselect器是如何工作的。

 <h:outputText value="#{bean.text1}" id="textId" /> <p:commandButton update="textId" /> 

textId引用组件树中的组件的ID,如服务器端的XHTML文件中定义的。 所以我可以理解JSF如何find正确的组件。

但是,如果您使用的是primefacesselect器,则使用客户端的jQueryselect器。 JSF如何知道哪个组件需要更新? 有时候我有PFS的问题。 它似乎并不总是为我工作。 如果你使用PFS,有什么你应该记住的?

您可能已经知道PrimeFaces正在使用jQuery。 PrimeFacesselect器基于jQuery。 您在@(...)指定的任何内容都将用作当前HTML DOM树上的jQueryselect器。 对于任何find的具有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> 

这个命令button更新

 <p:commandButton ... update="@(.myclass)" /> 

最终会产生与之完全相同的效果

 <p:commandButton ... update=":formId:output1 :formId:output3" /> 

请注意,这也适用于自动生成的ID。 即<h:form id>不是强制性的。


有时候我有PFS的问题。 如果你使用PFS,有什么你应该记住的?

可能会发生你select了“太多”(例如@(form)不select当前表单,而是所有表单,就像jQuery中的$("form") ),或者你实际上没有select任何东西HTML DOM元素实际上没有ID)。 调查HTML DOM树中的元素ID和HTTPstream量监视器中的请求负载应该给出线索。

HTML DOM树中所需的元素必须具有(自动生成的)ID。 HTTPstream量监视器中的javax.faces.partial.render请求参数必须包含正确的客户端ID。 JSF组件树中元素的rendered属性在更新期间必须为 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>