Раньше у меня была куча <ui:composition>
шаблонов, и к ним добавлялись
<ui:include src="${bean.type}.xhtml">
<ui:param name="model" value="#{model}"/>
</ui:include>
${bean.type}
, которые указывали относительный путь к шаблону с именем. Например,
/a/b/c/table
/a/c/d/timeline
Теперь я реорганизую их для <ui:component>
s
<cc:interface componentType="table">
<cc:attribute name="model" type="my.company.Model" required="true"/>
</cc:interface>
<cc:implementation>
<!-- -->
</cc:implementation>
или рассматриваю возможность определения разметки в encodeXXX
методах
class Widget extends UIComponentBase {}
class Table extends Widget {}
class TimeLine extends Widget {}
означает, что у меня будут компоненты
mycompany:table
mycompany:timeline
В настоящее время я не могу объявить, что у них есть только их имя из свойства бина
<mycompany:${bean.type} model="#{model}" />
<!-- this obviously doesn't work, but nicely illustrates the idea -->
Я надеваю не хочу, чтобы rendered
magi c отображал определенный тег, только если свойство соответствует типу. Я ищу масштабируемое решение, потому что иерархия пользовательских компонентов огромна, и я не хочу просто перечислять их все в шаблоне
<mycompany:table rendered="${bean.type == 'table'}" />
<mycompany:timeline rendered="${bean.type == 'timeline'}" />
<!-- and a lot more -->
Я искал какой-то тег / компонент-преобразователь, который я бы дал «абстрактному» тегу для
<mycompany:widget model="#{model}">
, и он бы преобразовал его в соответствующий подкласс виджета с учетом #{bean.type}
, аналогично тому, что делает Application#createComponent(context, name)
.
Спасибо.
Похожие:
jsf dynamici c тег из строки