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>