Я хочу разработать составной компонент 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}"/>
, окружающих каждый компонент, который я хочу обновить (что, очевидно, невозможно) составной файл компонента / тега в целом, означающий обновление каждого компонента в черном ящике.