如何发出<h:dataTable>
从 javascript更新 a 的 ajax 请求?我目前正在使用加载初始数据,@Postconstruct
但这显着延迟了初始页面加载。
我正在考虑使用HTML 标记的onload
事件<body>
来触发请求并更新数据表。
如何发出<h:dataTable>
从 javascript更新 a 的 ajax 请求?我目前正在使用加载初始数据,@Postconstruct
但这显着延迟了初始页面加载。
我正在考虑使用HTML 标记的onload
事件<body>
来触发请求并更新数据表。
在理论上下面应该这样做。
<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
set 一起使用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 中,您几乎可以在任何其他 jsf 标签中使用 f:ajax 标签,例如
<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 被排队并且在 postconstruct mehtod 中抛出时不显示......见最后一条评论)
<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 的生命周期阶段,但这个解决方案对我有用。