jsf - 更新 ="@(.myClass)"中的 PrimeFaces 选择器如何工作?

标签 jsf jsf-2 primefaces jquery-selectors

我不明白怎么办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 引用服务器端 XHTML 文件中定义的组件树中组件的 ID。这样我就可以理解 JSF 如何找到正确的组件。

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

最佳答案

您可能已经知道 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>不是强制性的。

<小时/>

Sometimes I have a problems with PFS. Is there something what you are should keep in mind if you are using PFS ?

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

HTML DOM 树中所需的元素必须有一个(自动生成的)ID。 javax.faces.partial.render HTTP 流量监视器中的请求参数必须包含正确的客户端 ID。该元素的rendered JSF 组件树中的属性必须评估 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>

关于jsf - 更新 ="@(.myClass)"中的 PrimeFaces 选择器如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20080861/

相关文章:

jsf - selectOneMenu 在提交后始终显示列表中的最后一项作为所选项目

java - session 过期时如何禁用重定向到 JBoss 中的登录页面?

jsf - p :pickList doesn't update the source and target

JSF PrimeFaces 动态数据表映射

jsf-2 - 在 rowEditor 更新模型之前显示 confirmDialog

jsf-2 - 修改primefaces的图像 rowToggler

java - Spring webflow,仅当语句为 true 时才传输

java - I18n - JSF 变量值翻译

jsf - 如何使用 JSF 2.0 Facelets 在 XHTML 中包含另一个 XHTML?

css - 在 JSF 2.0 中从 CSS 资源中加载图像