Выполнить метод managebean из события загрузки Javascript
Как я могу сделать запрос AJAX, который обновляет <h:dataTable>
из JavaScript? В настоящее время я загружаю исходные данные, используя @Postconstruct
но это значительно задерживает начальную загрузку страницы.
Я думаю об использовании onload
событие <body>
HTML-тег для запуска запроса и обновления таблицы данных.
3 ответа
Теоретически следующее должно сделать это.
<h:body>
<f:ajax event="load" listener="#{bean.onload}" />
</h:body>
с
public void onload(AjaxBehaviourEvent event) {
// ...
}
Однако по какой-то причине это не поддерживается. Я когда-либо публиковал отчет об этом.
Следующее работает, но по сути это взлом.
<h:head>
<title>JSF 2.0 onload hack</title>
<script>
window.onload = function() {
document.getElementById('hidden:link').onclick();
}
</script>
</h:head>
<h:body>
<h:form id="hidden" style="display:none">
<h:commandLink id="link">
<f:ajax event="click" listener="#{bean.onload}" />
</h:commandLink>
</h:form>
</h:body>
Если вам случится использовать PrimeFaces, то вы можете использовать его <p:remoteCommand>
сautoRun
установлен вtrue
,
<h:body>
<h:form>
<p:remoteCommand name="onload" action="#{bean.onload}" autoRun="true" />
</h:form>
</h:body>
Или, если вы используете OmniFaces, то вы можете использовать его<o:commandScript>
<h:body>
<h:form>
<o:commandScript name="onload" action="#{bean.onload}" />
<h:outputScript target="body">onload()</h:outputScript>
</h:form>
</h:body>
<h:outputScript target="body">
оказывает<script>
в конце <body>
, Предстоящий OmniFaces 2.2 устранит эту потребность новымиautorun
атрибут
<h:body>
<h:form>
<o:commandScript name="onload" action="#{bean.onload}" autorun="true" />
</h:form>
</h:body>
В jsf2.0 вы можете использовать тег f:ajax практически в любом другом теге jsf, например
<h:selectOneRadio id="myComponent" value="#{someBean.inputMethod}">
<f:selectItem itemValue="#{someBean.A}" itemLabel="A" />
<f:selectItem itemValue="#{someBean.B}" itemLabel="B" />
<f:ajax event="click" action=#{someBean.someMethod} />
</h:selectOneRadio>
В этом примере someMethod выполняется в событии javasript onClick для myComponent selectOneRadio.
Не уверен, что это то, что вы после....
Я решил это с помощью функций метаданных, поскольку я не мог использовать @PostContruct (FacesMessages ставятся в очередь и не отображаются при добавлении в метод постконструктора... см. Последний комментарий)
<f:metadata>
<f:viewAction action="#{bean.initProducts}" />
</f:metadata>
<h:body>
<ui:composition template="/templates/commonTemplate.xhtml">
<ui:define name="body">
<h:panelGroup>
<h:dataTable id="table"
value="#{bean.getProducts}" var="product"
<!-- Table Stuff-->
</h:dataTable>
</h:panelGroup>
</ui:define>
</ui:composition>
Я очень новичок в JSF, поэтому... Я не очень много знаю о фазах жизненного цикла JSF, но это решение сработало для меня.