web-dev-qa-db-fra.com

Exécuter la méthode de bean managé à partir d'un événement onload javascript

Comment puis-je faire une demande ajax qui met à jour un <h:dataTable> à partir de javascript? Je charge actuellement les données initiales à l'aide de @Postconstruct mais cela retarde considérablement le chargement initial de la page.

Je pense à utiliser onload événement de <body> Balise HTML pour déclencher la demande et mettre à jour la table de données.

28
Farouk Alhassan

Dans la théorie , ce qui suit devrait le faire.

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

avec

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

Cependant, cela n'est pas pris en charge pour une raison quelconque. J'ai déjà publié un rapport de problème à ce sujet.

Les travaux suivants, mais c'est essentiellement un hack.

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

S'il vous arrive d'utiliser PrimeFaces, vous pouvez utiliser son <p:remoteCommand> avec autoRun défini sur true .

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

Ou si vous utilisez OmniFaces, vous pouvez utiliser son <o:commandScript>

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

Le <h:outputScript target="body"> rend le <script> à la fin du <body>. La prochaine OmniFaces 2.2 supprimera ce besoin par nouvel attribut autorun .

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

dans jsf2.0, vous pouvez utiliser la balise f: ajax dans presque toutes les autres balises jsf, par exemple

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

Dans cet exemple, la méthode someMethod est exécutée dans l'événement javasript onClick pour "myComponent" selectOneRadio

Je ne sais pas si c'est ce que vous recherchez ...

1
ChristiaanP