gpt4 book ai didi

jsf-2 - 在复合组件中获取正确的父 ID

转载 作者:行者123 更新时间:2023-12-01 07:38:20 24 4
gpt4 key购买 nike

为了部分更新我的复合组件,我在找到正确的父 ID 时遇到了一些问题。例如如果我的组件在 tabView 内

<p:tabView id="foo">
<p:tab>
<stg:mycomponent id="bar" />
</p:tab>
</p:tabView>

现在我需要字符串 :foo:bar找到正确的部分,我想更新。通过 #{cc.id}我刚收到 bar ,所以这对我不起作用。

但是,我试图通过向我的组件添加一个属性来通过某种肮脏的黑客来实现这一点
<composite:attribute
name="parentId"
default=":#{component.namingContainer.parent.namingContainer.clientId}"
/>

如果我交出字符串 :foo:barparentId一切正常,但当然这不是我真正想做的。我不想强制我的组件的用户交出这个 ID。

但现在的问题是:如果我不交出 parentId,我只能在组件的“第一级”中使用我的属性。如果存在某种“嵌套 ID”,则 #{cc.attrs.parentId}被评估例如至 foo:bar (这很好)而且还有 foo:bar:fooBar或类似的东西,取决于在哪里 #{cc.attrs.parentId}位于我的代码中。

我希望我的问题是什么以及我真正要求的是什么是可以理解的。如果没有,请发表评论。

我正在使用 primefaces 3.5 和 JSF 2.1 (Mojarra)

最佳答案

如果我理解,您需要在复合组件本身内更新复合组件的部分。通常你不需要知道 parent 的 ID 来实现这一点。

当您在 primefaces 组件上设置 id 时,您可以使用相同的 id(没有任何 :container:etc 前缀)使用 primefaces 更新它,只要您的更新在同一范围内。

这是一个例子(见下面的来源)。

在第一个选项卡中观察 JSF 生成的 HTML 页面中生成的 id:

  • 第一个范围:id="static"(原始 html id,不是 PF,在文档中不是唯一的)
  • 第二个范围:id="myform:tv1:comp1:static2"(PF 生成以确保 id 在文档中是唯一的)
  • 第三个范围:id="myform:tv1:comp1:dynamic"(PF 生成的,唯一的)
  • poll 组件使用 id“myform:tv1:comp1:dynamic”,即使我们只在源中提供“dynamic”。
  • 父级不需要知道要更新的组件的 ID
  • 组件不需要知道其父/容器的 ID

  • 请注意在第二个选项卡上生成的 ID。 PrimeFaces 通过命名它们来完成它的工作。

    示例复合组件:
    <composite:interface>
    <composite:attribute name="label" />
    </composite:interface>
    <composite:implementation>
    <h1><h:outputText value="#{cc.attrs.label}"/></h1>
    <span id="static1">
    Static : #{testBean.increment}
    </span>
    <p:outputPanel id="static2">
    Static : #{testBean.increment}
    </p:outputPanel>
    <p:outputPanel id="dynamic">
    Dynamic : #{testBean.increment}
    </p:outputPanel>
    <p:poll interval="3" update="dynamic" />
    </composite:implementation>

    在 XHTML 页面中使用该组件:
    <h:form id="myform">
    <p:tabView id="tv1" >
    <p:tab id="tab1" title="First Tab">
    <comps:myComponent id="comp1" label="Abc" />
    </p:tab>
    <p:tab id="tab2" title="Second Tab">
    <comps:myComponent id="comp2" label="Def" />
    </p:tab>
    </p:tabView>
    </h:form>

    这是测试 bean 的代码:
    @ManagedBean(name="testBean")
    public class TestBean implements Serializable
    {
    static int _counter = 0;
    public String getIncrement()
    {
    _counter++;
    return Integer.toString(_counter);
    }
    }

    我希望这个例子足够清楚并且接近你想要的结果。
    请告诉我。

    关于jsf-2 - 在复合组件中获取正确的父 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20707572/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com