当前位置: 首页 > 知识库问答 >
问题:

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

辛才俊
2023-03-14

我不明白PrimeFaces选择器(PFS)是如何工作的。

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

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

我可以理解正常的JSF ID选择器是如何工作的。

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

text Id引用了服务器端XHTML文件中定义的组件树中的组件ID。所以我可以理解JSF如何找到正确的组件。

但是如果您使用的是primefaces选择器,则使用客户端jQuery选择器。JSF如何知道哪些组件需要更新?有时我在PFS方面有问题。它似乎并不总是对我有用。如果您使用PFS,您应该记住什么?

共有1个答案

冀弘济
2023-03-14

您可能已经知道PrimeFaces在幕后使用jQuery。PrimeFaces选择器基于jQuery。您在@(…)中指定的任何内容将用作当前HTMLDOM树上的jQuery选择器。对于任何找到的具有ID的HTML元素,该ID最终将在更新中使用。

基本上,对于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。即代码

有时我对PFS有问题。如果您使用PFS,您是否应该记住什么?

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

HTML DOM树中所需的元素必须具有(自动生成的)ID。面孔。部分的HTTP流量监视器中的render请求参数必须包含正确的客户端ID。JSF组件树中元素的呈现的属性必须在更新期间计算true。等等。

在您的特定示例中,

所以,这个例子不起作用

<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>

 类似资料:
  • 我正在使用Primeface 4.0,我有一个具有多种选择功能的日期表。我愿意实现的是仅通过复选框按钮选择行,禁用单击行的功能。在当前场景中,即使我单击任何行,我也选中了复选框,我想禁用行选择。 我从这个论坛上得到了一些解决方案,但无法解决。请告诉我需要做什么。

  • 我正在使用liveScroll="true"和seltionMode="multi"的primeface v5.3 dataTable。标题复选框仅选择可见行,当我向下滚动时,新行显示为未选中。我希望标题复选框选择所有行:可见和不可见。仅选择可见行是毫无意义和无用的。是否可以修复? 我试图通过处理“toggleSelect、rowSelectCheckbox和rowUnselectCheckbox

  • 你需要在你个人的需要和团队的需要间权衡,选择需要做工程中的哪个部分。你应该做你最擅长的东西,但是也要试着去找一种方式来激励自己,不是通过承担更多的工作而是通过练习新的技能。领导才能和交流能力比技术能力更重要。如果你非常强大,承担最困难或最有风险的任务,在工程中尽可能早地完成这部分,以此减少风险。

  • 我试图将Primefaces datatable与单选按钮选择一起使用,但未触发rowSelect事件。 如果我在数据表中设置selectionMode=“single”,则会触发事件,但整行都可以单击。 使用单选按钮选择时是否可能触发rowSelect事件?

  • 我有一个primefaces p:treeTable,在它里面我定义了一个包含两个组件的列:span标记和h:outputText标记。当前,如果我单击其中一个元素,就会触发select event of table。但我的目的是,仅当我单击文本的某个部分(而不是span元素)时,才会触发select事件。我该怎么做?

  • 我想计算选择属性中的选项,但我的测试失败了,这是我的规范: 它给了我错误: C:\wamp\www\First-angular-App