UIComponent getAttributes仅从JSF获取最后一个值

时间:2016-06-06 21:31:39

标签: jsf composite-component ajax4jsf

我有一个JSF 2.2复合组件,它在同一页面上使用了不止一次。

@FacesComponent("myComponent")
public class MyComponent extends UIComponent {

    public void test() {
        System.out.printlin(getAttributes("value"));
    }
}

组件xhtml:

<composite:interface componentType="myComponent">
    <composite:attribute name="value" required="true" type="java.lang.String" />
</composite:interface>

<composite:implementation>
    <a4j:jsFunction name="test" action="#{cc.test()}" execute="input" />

    <s:span id="input">
        <h:inputText value="#{cc.attrs.value}" onclick="test()" />
    </s:span>
</composite:implementation>

第xhtml页

<my:myComponent value="#{bean.value}" />  -- line 1
<my:myComponent value="#{bean2.value}" /> -- line 2

当我点击第一个myComponent时,它调用test()但是打印bean2.value而不是bean.value的值。如果我删除第2行,则打印bean.value。我认为对getAttributes()的调用将获得当前复合组件的值,但似乎它只获取页面上最后一个复合组件的值。有人可以向我解释属性应该如何工作或我缺少什么?

1 个答案:

答案 0 :(得分:0)

这是解决方案,将id属性附加到jsFunction以区别于页面上的其他相同组件:

<composite:interface componentType="myComponent">
    <composite:attribute name="id" type="java.lang.String" />
    <composite:attribute name="value" required="true" type="java.lang.String" />
</composite:interface>

<composite:implementation>
    <a4j:jsFunction name="#{cc.attrs.id}test" action="#{cc.test()}" execute="input" />

    <s:span id="input">
        <h:inputText value="#{cc.attrs.value}" onclick="#{cc.attrs.id}test()" />
    </s:span>
</composite:implementation>