Двухсторонняя манипуляция атрибутами составного компонента - PullRequest
0 голосов
/ 02 декабря 2011

У меня есть пара страниц, на которых я хочу использовать составной компонент, который отображает, добавляет и удаляет список языковых вкладок.

Страница, использующая составной компонент, может выглядеть следующим образом:

...
<ccc:languageTabs languages="#{viewBean1.languages}">
    // some input components
    // example:
    <h:inputText value="#{viewBean1.name[language.id]}"/>
</ccc:langaugeTabs>
...

Составной компонент выглядит примерно так:

...
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:web="http://industry-supply.dk/jsf"
      xmlns:cc="http://java.sun.com/jsf/composite">
    <cc:interface>
        <cc:attribute name="languages"/>
    </cc:interface>
    <cc:implementation>
        <div id="#{cc.clientId}">
        ...
        <web:iterator value="#{cc.attrs.languages}" var="language">
            // render some tabs
        </web:iterator>
        <web:iterator value="#{viewBean2.otherLanguages}" var="language">
            <h:commandLink action="#{viewBean2.add(language.id)}">
                <f:ajax execute="@this" render=":#{cc.clientId}"/>
                // label
            </h:commandLink>
        </web:iterator>
        <web:iterator value="#{cc.attrs.languages}" var="language">
            <h:commandLink action="#{viewBean2.remove(language.id)}">
                <f:ajax execute="@this" render=":#{cc.clientId}"/>
                // label
            </h:commandLink>
            <cc:insertChildren/>
        </web:iterator>
        ...
        </div>
    </cc:implementation>
...

Итак, проблема в том, что у меня 2 компонента.У меня есть viewBean1 для моей страницы с компонентами ввода, а viewBean2 для моего составного компонента, потому что я хочу, чтобы все функциональные возможности компонентов были удалены из viewBean1, чтобы его можно было повторно использовать.Но список с языками происходит от viewBean1 и управляется viewBean2. Вопрос в том, как я могу сделать так, чтобы изменения, которые я выполняю в списке в viewBean2, отражали на viewBean1, не связывая вместе 2 компонента?Я не думаю, что это так.Там не будет никаких изменений на самой странице.Только составной компонент, который будет / должен / мог бы выглядеть так:

...
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:web="http://industry-supply.dk/jsf"
      xmlns:cc="http://java.sun.com/jsf/composite">
    <cc:interface>
        <cc:attribute name="languages" boundTo="viewBean2.languages"/>
    </cc:interface>
    <cc:implementation>
        <div id="#{cc.clientId}">
        ...
        <web:iterator value="#{viewBean2.languages}" var="language">
            // render some tabs
        </web:iterator>
        <web:iterator value="#{viewBean2.otherLanguages}" var="language">
            <h:commandLink action="#{viewBean2.add(language.id)}">
                <f:ajax execute="@this" render=":#{cc.clientId}"/>
                // label
            </h:commandLink>
        </web:iterator>
        <web:iterator value="#{viewBean2.languages}" var="language">
            <h:commandLink action="#{viewBean2.remove(language.id)}">
                <f:ajax execute="@this" render=":#{cc.clientId}"/>
                // label
            </h:commandLink>
            <cc:insertChildren/>
        </web:iterator>
        ...
        </div>
    </cc:implementation>
...

Кто-нибудь знает, возможно ли что-то подобное?Или, если нет, если возможно расширить cc новым компонентом, который позволил бы такое поведение?

...