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

时间:2013-12-20 16:06:57

标签: jsf-2 primefaces composite-component

对于部分更新我的复合组件,我在查找正确的父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:bar移交给parentId,一切正常,但当然这不是我真正想做的事情。我不想强迫我的组件的用户移交此ID。

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

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


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

1 个答案:

答案 0 :(得分:1)

如果我理解,您需要在复合组件本身内更新复合组件的各个部分。通常,您无需知道父母ID即可实现此目的。

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

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

在第一个标签中观察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”,即使我们只在源代码中提供“动态”。
  • 父母不需要知道要更新的组件部分的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);
    }
}

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