您可能已经知道 PrimeFaces 在幕后使用 jQuery。 PrimeFaces 选择器基于 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。 IE。 <h:form id> 不是强制性的。
有时我在使用 PFS 时遇到问题。如果您使用 PFS,有什么需要注意的吗?
您可能选择了“太多”(例如,@(form) 不会选择当前表单,而是 所有 表单,就像 jQuery 中的 $("form")!),或者您实际上什么都不选择(当所需的 HTML DOM 元素实际上没有 ID 时)。调查 HTML DOM 树中的元素 ID 和 HTTP 流量监视器中的请求负载应该会提供线索。
HTML DOM 树中所需的元素必须有一个(自动生成的)ID。 HTTP 流量监视器中的 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>