JSF更新复合组件的某些部分

JSF更新复合组件的某些部分,jsf,jsf-2,composite-component,Jsf,Jsf 2,Composite Component,我想使用PrimeFaces库开发一个JSF复合组件 基本上我想更新我的复合组件。我读过一些关于它的问题。但在这种情况下,我只想更新组件的某些部分 这里有一个例子。我的组件应该是的标签/消息/值部分,以消除-标记的所有噪音 <composite:interface> <composite:attribute name="label" required="true" /> <composite:attribute name="value" requir

我想使用PrimeFaces库开发一个JSF复合组件

基本上我想更新我的复合组件。我读过一些关于它的问题。但在这种情况下,我只想更新组件的某些部分

这里有一个例子。我的组件应该是
的标签/消息/值部分,以消除
-标记的所有噪音

<composite:interface>
    <composite:attribute name="label" required="true" />
    <composite:attribute name="value" required="true" />
</composite:interface>

<composite:implementation>
    <p:column>
        <!-- label -->
        <p:outputLabel value="#{cc.attrs.label}" for="id_inputtext"/>
    </p:column>
    <p:column>
        <!-- message -->
        <p:message for="id_inputtext" />
    </p:column>
    <p:column>
        <!-- inputtext -->
        <p:inputText id="id_inputtext" value="#{cc.attrs.value}"/>
    </p:column>
</composite:implementation>

要使用这个复合组件,我可以简单地将它放在一个panelgrid中,就像这样

<p:panelGrid>
    <p:row>
        <mycomponent:columnSet id="c1" label="label" value="hello world"/>
        <mycomponent:columnSet id="c2" label="label2" value="hello world2"/>
    </p:row>
    <p:row>
        <mycomponent:columnSet id="c3" label="label3" value="hello world3"/>
        <mycomponent:columnSet id="c4" label="label4" value="#{bean.someValue}"/>
    </p:row>
</p:panelGrid>

在这种情况下,我不能像上面的链接中描述的那样,用HTML容器元素(如
)来包围组件的内容。这将导致奇怪的HTML,因为它将在生成的表中

在上面的示例中,我想做的是从组件外部更新
。在一个完美的世界中,我想独立地更新这三个组件(但我想这比一次性更新还要复杂)

我现在所做的是为了让它发挥作用,这是一种欺骗。我创建了一个
,并根据使用复合组件id的约定为三个组件提供了固定id。这样做很有效,但效果很差,因为使用复合组件时,需要了解它的内部实现

有没有人有更好的办法来解决这个问题

<composite:interface>
    <composite:attribute name="id" required="true" />
</composite:interface>

<composite:implementation>
    <p:column>
        <!-- label -->
        <p:outputLabel id="#{cc.attrs.id}_label"/>
    </p:column>
    <p:column>
        <!-- message -->
        <p:message id="#{cc.attrs.id}_message" />
    </p:column>
    <p:column>
        <!-- inputtext -->
        <p:inputText id="#{cc.attrs.id}_value"/>
    </p:column>
</composite:implementation>

编辑 感谢您在评论中的快速回复

至于标记文件:事实上,我必须承认我避免处理标记文件,因为复合组件更容易处理,我的缺点是

无论如何,我只是读了一些东西,制作了一个快速而肮脏的原型,但得出的结论是(尽管在这种标签/消息/输入情况下使用标记文件可能是一种良好而正确的方法),我与复合组件有着相同的问题:要更新标记文件中的组件,我需要知道它的内部实现(这与我的解决方案中描述的相同)

我想用«单句柄»从外部更新复合组件/标记文件,并将其视为黑盒

如果我想要一个功能,我想在复合组件/标记文件上说“执行更新”。在复合组件/标记文件中,我可以定义如果触发“执行更新”,应该更新哪些组件。类似于三个单独的
围绕我要更新的每个组件(这显然是不可能的)


因为我想这几乎是不可能的,所以我也很高兴有一种方法可以整体更新复合组件/标记文件,这意味着更新黑盒子中的每个组件。

如果您为我们的复合组件分配一个ID,比如
,通常内部实现组件应该已经添加了
c1
即使没有
,你也应该使用标记文件,而不是复合组件使用前缀id并不奇怪。PrimeFaces也会为组件中的所有div/span/real输入等进行标记。好的,这些都是纯html的东西,同意这是一个区别。我同意,这个问题与标记无关文件或复合组件。但你的最后一句话让我感到困惑。你说你想整体更新cc/tag文件,但你的标题说明不同。你说的“就我刚才在谷歌搜索到的而言,这在标记文件中是不可能的”是什么意思关于更新s a Wholey,您还可以分配类并使用PrimeFaces选择器来选择要更新的内容。真正的完整用例有点相关。是的,对不起,我可以看到您对我的措辞感到困惑。我说得更准确。我将查看PrimeFaces选择器。谢谢!