7

私はこの簡単なページを持っています:

<h:form id="form">

    <p:dataTable value="#{testBean.unitTypeModel}" var="elem" lazy="true" rows="10">
        <p:column headerText="class">#{elem.class.simpleName}</p:column>
        <p:column headerText="code">#{elem.code}</p:column>
        <p:column headerText="description">#{elem.description}</p:column>
        <p:column headerText="action">
            <p:commandButton action="test2" icon="ui-icon ui-icon-wrench" value="edit">
                <f:setPropertyActionListener target="#{testBean.selection}" value="#{elem}"/>
            </p:commandButton>
        </p:column>
    </p:dataTable>

    <p:commandButton action="test2" icon="ui-icon ui-icon-wrench"/>

</h:form>

CommandButton内部は機能しDataTableていません。ページを更新するだけです。しかし、外側のものは機能しています。

私がこのように変更valueした場合lazy

<h:form id="form">

    <p:dataTable value="#{testBean.unitTypeModel.load(0, 10, null, null, null)}" var="elem" lazy="false" rows="10">
        <p:column headerText="class">#{elem.class.simpleName}</p:column>
        <p:column headerText="code">#{elem.code}</p:column>
        <p:column headerText="description">#{elem.description}</p:column>
        <p:column headerText="action">
            <p:commandButton action="test2" icon="ui-icon ui-icon-wrench" value="edit">
                <f:setPropertyActionListener target="#{testBean.selection}" value="#{elem}"/>
            </p:commandButton>
        </p:column>
    </p:dataTable>

    <p:commandButton action="test2" icon="ui-icon ui-icon-wrench"/>

</h:form>

CommanButton内部はDataTable魅力のように機能します。

誰かが理由を知っていますか?

バグですか?

私は〜に乗っています

  • グラスフィッシュ 3.1.2
  • JSF 2.1.11 (モハラ)
  • PrimeFaces 3.4-スナップショット
4

2 に答える 2

7

遅延データモデルは、ポストバック要求で同じインスタンスでなければならないことがわかりました。まったく同じ値を持つ新しいインスタンスであっても機能しません。したがって、少なくとも@ViewScopedBean から提供する必要があります。

于 2012-08-17T09:55:07.400 に答える
4

この質問が投稿されてから 4 年が経過しましたが、問題はまだ PrimeFaces 6.0 に残っています。

ViewScoped Bean を使用したくない (または使用できない) 人に回避策を投稿します。

前提は、「RequestScopedのものにバインドされた遅延データテーブル内に「ajax化された」アイテムを配置することはできません」です。一度もない。ajax 呼び出しをスローするものはすべて機能しないことに注意してください。

したがって、最初のステップは、データテーブルの外で ajax 呼び出しを行うことです。これは、RemoteComand を使用して行います。この RemoteCommand は、DataTable の外 (もちろん、フォーム内) のどこにでも配置できます。

<p:remoteCommand name="remoteCall" action="#{bean.doStuff()}">
</p:remoteCommand>

あとは、DataTable 内からこの RemoteCommand を呼び出すだけです。リンクを使用して JavaScript 呼び出しを実行していますが、ボタンなどを使用することもできます。

<p:column>
    <p:link value="#{item.id}" href="#" onclick="remoteCall([{name:'id', value:#{item.id}}])">
    </p:link>
</p:column>

このリンクは、「bean.doStuff()」への ajax 呼び出しを実行する JavaScript 関数「remoteCall」を呼び出す方法を提供します。

onClick イベントには、「remoteCall」への JavaScript 呼び出しだけでなく、「#{item.id}」という値を持つ「id」という名前のパラメーターが 1 つだけ含まれるパラメーター配列も含まれていることに注意してください。これにより、RemoteCommand が「id」という名前のパラメーターをバッキング Bean に送信できるようになります。

「doStuff」メソッド内で、「id」パラメーター値を取得する必要があります。

public void doStuff () {

    String id = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("id");

}
于 2017-03-05T11:24:39.430 に答える