У меня есть очень простой JSF 2/Facelets страницы, которая выглядит следующим образом:почему действие в <ч: commandLink> не работает внутри составного компонента
<ui:repeat value="#{myBean.names}" var="_name">
<h:commandLink value="#{_name}" action="#{myBean.sayHello(_name)}">
<f:ajax execute="@this"/>
</h:commandLink>
<br/>
</ui:repeat>
Подложка боб обеспечивает java.util.List<String>
с именами и метод action просто печатает сообщение "hello <name>"
на стандартный вывод.
Это прекрасно работает. Я получаю список имен в браузере, и щелчок запускает метод action, который приветствует указанное имя.
Проблема возникает, когда я хочу, чтобы поместить этот код в составной компонент, который делает итерации и делает фактическую связь через фаской:
<ui:component xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:cc="http://xmlns.jcp.org/jsf/composite">
<cc:interface>
<cc:attribute name="value" type="java.util.List" required="true" />
<cc:facet name="content" />
</cc:interface>
<cc:implementation>
<ui:repeat value="#{cc.attrs.value}" var="_name">
<cc:renderFacet name="content"/>
</ui:repeat>
</cc:implementation>
</ui:component>
я использую составной компонент, как это:
<my:myComp value="#{bean.names}">
<f:facet name="content">
<h:commandLink value="#{_name}" action="#{bean.sayHello(_name)}">
<f:ajax execute="@this"/>
</h:commandLink>
<br/>
</f:facet>
</my:myComp>
В браузере я получаю список имен, которые выглядят точно так же, как раньше. Но нажатие ссылки теперь отображает сообщение "hello null"
. Таким образом, _name
разрешен правильно в атрибуте value
<h:commandLink>
, но не в атрибуте action
.
Я также попытался с помощью actionListener
вместо action
или атрибут listener
из <f:ajax>
теге без разницы.
Не могли бы кто-нибудь затмить свет по этому вопросу?
Моя среда:
- WildFly 8,1 с
- JSF 2.2.6 (Mojarra)
Спасибо за ваш ответ. Ваше обходное решение действительно, и это на самом деле то, как я его уже (хотел опубликовать это позже). К сожалению, вы не объясняете детали, почему переменная разрешается один раз (для значения), но не в другое время (для действия). И это то, что меня действительно интересует. Не могли бы вы также предоставить эту информацию, пожалуйста? –
Существует очень хорошее объяснение с примерами здесь: [Значения h: inputText внутри ui: repeat не обрабатываются] (http: // stackoverflow.com/a/16550781/160361) –
Я совершенно уверен, это что-то другое. Мой код работает вне составного компонента и не вызывает никакого сеттера. И переменная, кажется, установлена, так как я могу вывести ее значение. Кроме того, я попытался использовать обертку, как в вашей опубликованной ссылке, без различия в поведении. –