JSF обновляет определенные части составного компонента - PullRequest
0 голосов
/ 13 марта 2020

Я хочу разработать составной компонент JSF с помощью библиотеки PrimeFaces.

По сути, я хочу обновить свой составной компонент. Я прочитал некоторые SO вопросы об этом ( JSF обновляет составной компонент или JSF Обновляет составной компонент (Primefaces) ). Но в этом случае я хочу обновить только некоторые части компонента.

Вот пример. Мой компонент должен быть меткой / сообщением / значением-частью <p:panelGrid />, чтобы избавиться от всего шума <p:column/> -tags.

<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>

Чтобы использовать этот составной компонент, я могу просто поместить это в панели, например, так.

<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 контейнерным элементом, например <div/> или <span/>, как это описано в приведенных выше ссылках. Это может привести к странным HTML, потому что это будет в сгенерированной таблице.

Что я хочу сделать в приведенном выше примере, это обновить <p:outputLabel/>, <p:message/> и <p:inputText/> из за пределами компонента. В идеальном мире я хочу обновить эти три компонента независимо друг от друга (но я полагаю, что это даже сложнее, чем обновить все сразу).

То, что я сейчас делаю, чтобы заставить это работать, является своего рода * жульничество 1029 *. Я создаю <composite:attribute name="id" /> и присваиваю трем компонентам фиксированные идентификаторы на основе соглашения, используя составной идентификатор компонента. Это работает, но довольно плохо, потому что при использовании составного компонента нужно знать внутреннюю реализацию it.

У кого-нибудь есть идея решить это требование более хорошим способом?

<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>

РЕДАКТИРОВАТЬ

Спасибо за быстрый ответ в комментариях.

Что касается файлов тегов: действительно, я должен признать, что я избегал иметь дело с файлами тегов, потому что составные компоненты намного проще в обращении, мой плохой.

В любом случае, я просто прочитал кое-что, сделал быстрый и грязный прототип, но пришел к выводу, что (хотя это может быть хорошим и правильным способом использовать файлы тегов в этой метке / сообщении / вводе -ситуация) У меня та же проблема, что и с составным компонентом: для обновления компонентов внутри файла тега мне нужно знать его внутреннюю реализацию (то же самое, что описано в моем обходном пути).

Я хочу обновить составной файл компонента / тега снаружи с помощью «единого дескриптора» и рассматривать его как черный ящик.

Если бы я мог wi sh для функции, я бы хотел что-то сказать «сделать обновление» в файле составного компонента / тега. И в файле составного компонента / тега я могу определить, какие компоненты должны быть обновлены, если «сделать обновление» запущен. Примерно три отдельных <div id="#{cc.clientId}"/>, окружающих каждый компонент, который я хочу обновить (что, очевидно, невозможно) составной файл компонента / тега в целом, означающий обновление каждого компонента в черном ящике.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...