从javascript onload事件执行managebean方法
我怎样才能做一个Ajax请求,从JavaScript更新<h:dataTable>
? 我目前正在使用@Postconstruct
加载初始数据,但这是显着延迟初始页面加载。
我正在考虑使用<body>
HTML标签的onload
事件来触发请求并更新数据表。
从理论上讲 ,以下几点应该做到。
<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,那么你可以在autoRun
设置为true
使用它的<p:remoteCommand>
。
<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
不知道这是你之后….