update="@(.myClass)" 中的 PrimeFaces 选择器如何工作?

Posted

技术标签:

【中文标题】update="@(.myClass)" 中的 PrimeFaces 选择器如何工作?【英文标题】:How do PrimeFaces Selectors as in update="@(.myClass)" work? 【发布时间】:2013-12-03 13:19:59 【问题描述】:

我不明白PrimeFaces selectors (PFS) 的工作原理。

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

我可以使用它。我认为这是一个很棒的工具,尽管它并不总是对我有用。 .myClass 是客户端 jQuery 选择器。服务器端的 JSF 如何知道要更新什么?

我可以理解JSF ID selectors 的正常工作方式。

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

textId 引用了组件树中的组件 ID,如服务器端 Xhtml 文件中定义的那样。所以我可以理解 JSF 是如何找到正确的组件的。

但如果您使用 primefaces 选择器,则使用客户端 jQuery 选择器。 JSF 如何知道必须更新哪个组件?有时我会遇到 PFS 问题。它似乎并不总是对我有用。如果您使用 PFS,有什么需要注意的吗?

【问题讨论】:

【参考方案1】:

您可能已经知道 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。 &lt;h:form id&gt; 不是强制性的。


有时我在使用 PFS 时遇到问题。如果您使用 PFS,有什么需要注意的吗?

您可能选择了“太多”(例如,@(form) 不会选择当前表单,而是 所有 表单,就像 jQuery 中的 $("form")!),或者您实际上什么都不选择(当所需的 HTML DOM 元素实际上没有 ID 时)。调查 HTML DOM 树中的元素 ID 和 HTTP 流量监视器中的请求负载应该会提供线索。

HTML DOM 树中所需的元素必须有一个(自动生成的)ID。 HTTP 流量监视器中的 javax.faces.partial.render 请求参数必须包含正确的客户端 ID。 JSF 组件树中元素的rendered 属性必须在更新期间评估true。等等。

在您的特定示例中,&lt;h:outputText&gt; 不会以任何 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>

【讨论】:

谢谢!很好的解释。现在我知道我的问题是什么了。我并不总是在非NamingContainer 组件上使用id 属性。 所以更清楚一点,由于rendered="false" 而当前不在DOM 中的组件不能通过直接在update 中选择它们而受到影响。但是,可以通过选择父项来更新它们。例如update="@(#container :button) 将不起作用,但update="@(#container) 会。如果需要,请纠正我@BalusC! :) @Daniel:这并不特定于 PFS。使用标准 JSF 客户端 ID 时,您将面临完全相同的问题。另请参阅***.com/questions/9010734/… 我正在尝试从 ajax 异常处理程序 (Primefaces) 中按其类更新某些元素,但似乎任何通过其 id 选择多个组件的尝试都会遇到 @987654345 @ 信息。有谁知道这是否可能? 我们可以以编程方式更新“myclass”吗?我已经尝试了omnifcaes Ajax.update("@(.myclass)") 和其他方法的其他变体,例如primefaces 方法,但没有奏效。有没有一种简单的方法来以编程方式更新课程?

以上是关于update="@(.myClass)" 中的 PrimeFaces 选择器如何工作?的主要内容,如果未能解决你的问题,请参考以下文章

“= gcnew MyClass()”和“= %MyClass()”有啥区别?

c ++不存在从“myClass1”到“myClass1”的合适的用户定义转换

protobuf-net 的 [ProtoInclude(1, "MyClass")] 不起作用

“MyClass& func1(void)”和“MyClass* func2(void)”之间的区别 [重复]

Swift 类“MyClass”没有名为“My_Var”的成员 [重复]

如何修复“myClass 没有对象成员” [重复]