web-dev-qa-db-ja.com

javascript onloadイベントからマネージドBeanメソッドを実行する

Javascriptから<h:dataTable>を更新するajaxリクエストを作成するにはどうすればよいですか?現在、@Postconstructを使用して初期データを読み込んでいますが、初期ページの読み込みが大幅に遅れています。

<body> HTMLタグのonloadイベントを使用してリクエストを起動し、データテーブルを更新することを考えています。

28
Farouk Alhassan

theoryでは、次のようにする必要があります。

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

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

ただし、これは何らかの理由でサポートされていません。それについて issue report を投稿したことがあります。

以下は動作しますが、本質的にはハックです。

<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>autoRuntrue に設定されています。

<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では、この必要性が new autorun属性 によって削除されます。

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

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>

この例では、「myComponent」selectOneRadioのjavasript onClickイベントでsomeMethodが実行されます。

これがあなたが何を求めているかわからない....

1
ChristiaanP