preRenderView-Event, запускаемое перед действием (кнопка команды)
У меня небольшие проблемы с моим preRenderView-Event. Моя страница также использует командную кнопку для отправки данных, но, к сожалению, preRenderView-Event всегда вызывается до того, как вызывается действие кнопок.
PreRenderView-Event отвечает за загрузку данных из сервиса. Поскольку страница проста и не требует хранения каких-либо данных, мне не нужны Session или ViewScoped-Beans.
Насколько я понял, событие вызывается в фазе рендеринга-отклика, и действие в кнопке должно произойти несколько раньше.
<h:body>
<f:metadata>
<f:viewParam name="id" value="#{bean.id}" converter="converter.SetOfLongConverter"/>
<f:event type="preRenderView" listener="#{bean.initializeData}" />
</f:metadata>
<ui:composition template="/META-INF/templates/myTemplate.xhtml">
<ui:param name="title" value="#{bean.title}"/>
<ui:define name="content">
<h:outputText value="#{bean.description}" />
<h:form>
<h:panelGrid columns="2">
<h:outputLabel value="Model" for="model" />
<h:inputText id="model" value="#{bean.model}" />
<h:outputLabel value="Manufacturer" for="manufacturer" />
<h:inputText id="manufacturer"
value="#{bean.manufacturer}" />
<h:outputLabel value="Year" for="year" />
<h:inputText id="year" value="#{bean.year}" />
</h:panelGrid>
<h:commandButton value="Create" type="submit" action="#{bean.create}" rendered="#{bean.createMode}"/>
<h:commandButton value="Save" type="submit" action="#{bean.save}" rendered="#{!bean.createMode}" />
</h:form>
</ui:define>
</ui:composition>
</h:body>
Я добавил несколько консольных сообщений, чтобы проверить, когда вызывается метод в bean-компоненте, и когда у меня есть событие preRenderView, этого никогда не происходит.
Любой совет, что я здесь делаю не так?
1 ответ
<f:metadata>
должен идти внутрь <ui:define>
из <ui:composition>
,
Смотрите также <f:metadata>
Документация по тегам (выделено мной):
Объявите аспект метаданных для этого представления. Это должно быть дитя
<f:view>
, Этот тег должен находиться в файле XHTML верхнего уровня для данного viewId или в клиенте шаблона, но не в шаблоне. Реализация должна гарантировать, что прямым дочерним элементом фасета является UIPanel, даже если есть только один дочерний элемент фасета. Реализация должна установить идентификатор UIPanel равным значениюUIViewRoot.METADATA_FACET_NAME
символическая константа.
Простая причина заключается в том, что метаданные должны быть специфичными для представления, а не для конкретного шаблона.
Обновление: оказывается, что метод действия вообще не вызывается. Вы там rendered
атрибут на кнопке команды, который в зависимости от симптомов зависит от переменной, основанной на запросе, а не от переменной, основанной на представлении. Помещение управляемого компонента в область просмотра должно решить эту проблему. См. Также commandButton/commandLink/ajax action/listener метод не вызван или входное значение не обновлено