对于部分更新我的复合组件,我在查找正确的父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)
答案 0 :(得分:1)
如果我理解,您需要在复合组件本身内更新复合组件的各个部分。通常,您无需知道父母ID即可实现此目的。
当您在primefaces组件上设置id时,只要您的更新位于同一范围内,您就可以使用相同的id(不带任何:container:etc前缀)使用primeface来更新它。
这是一个例子(见下面的来源)。
在第一个标签中观察JSF生成的HTML页面中生成的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);
}
}
我希望这个例子足够清晰,并且接近你想要的。 请告诉我。