2011-04-02 13 views
26

¿Cómo puedo hacer una solicitud ajax que actualice un <h:dataTable> desde javascript? Actualmente estoy cargando los datos iniciales usando @Postconstruct pero eso está retrasando significativamente la carga de la página inicial.Ejecutar el método managebean desde javascript onload event

Estoy pensando en usar el evento onload de <body> etiqueta HTML para iniciar la solicitud y actualizar la tabla de datos.

Respuesta

52

En teoría lo siguiente debería hacerlo.

<h:body> 
    <f:ajax event="load" listener="#{bean.onload}" /> 
</h:body> 

con

public void onload(AjaxBehaviourEvent event) { 
    // ... 
} 

Sin embargo, esto no es apoyado por alguna razón. Alguna vez he publicado un issue report sobre eso.

Lo siguiente funciona, pero en esencia es un truco.

<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> 

Si usted usa PrimeFaces, a continuación, puede utilizar su <p:remoteCommand> con autoRun set to true.

<h:body> 
    <h:form> 
     <p:remoteCommand name="onload" action="#{bean.onload}" autoRun="true" /> 
    </h:form> 
</h:body> 

O si está usando OmniFaces, a continuación, puede utilizar su <o:commandScript>

<h:body> 
    <h:form> 
     <o:commandScript name="onload" action="#{bean.onload}" /> 
     <h:outputScript target="body">onload()</h:outputScript> 
    </h:form> 
</h:body> 

El <h:outputScript target="body"> hace que la <script> en el extremo de la <body>. El próximo OmniFaces 2.2 eliminará esta necesidad por new autorun attribute.

<h:body> 
    <h:form> 
     <o:commandScript name="onload" action="#{bean.onload}" autorun="true" /> 
    </h:form> 
</h:body> 
+0

teoría debería funcionar. no funciona. Pero el botón oculto funciona como hechizo –

+0

Lo primordial hizo el truco, incluso para redirigir (simplemente devuelva la página que desea del método de acción) – ACV

+0

@BalusC No puedo abrir el hipervínculo de informe de incidencias. ¿Ya se resolvió el problema? – Metalhead

1

en jsf2.0 puede utilizar el f: Etiqueta de ajax en casi cualquier otro ejemplo de etiquetas 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> 

En este ejemplo, el algunMetodo se excuted en el evento de clic javasript para el "myComponent" selectOneRadio

No estoy seguro si esto es lo que está después ....

+0

Gracias por eso, quiero que la solicitud se realiza de forma automática después de la página se carga –

+0

Mayby la PreRenderViewEvent podría funcionar para su problem' ' – ChristiaanP

+0

Pero esto no es asincrónico – Metalhead

Cuestiones relacionadas