1

私は PrimFaces モバイル従業員ディレクトリ アプリに取り組んでおり、障害にぶつかっています。2 つの画面 (従業員フィルター/リスト + 従業員の詳細) で構成されるシンプルなアプリです。

問題なくデータリストをロードできました。コマンドリンクをクリックすると、従業員の詳細が適切に読み込まれます。その後、カスタム従業員フィルターを実装することができましたが、これは少し面倒でしたが、うまくいきました。フィルターは、従業員データリストのモデルにフィルター処理された結果を再入力することによって機能します。

問題は、フィルターを使用してデータリストを再作成/フィルター処理した後、従業員 (コマンドリンク) をクリックしても正しい従業員 ID がモデルに返されないことです。代わりに、フィルターが実行される前に存在していた従業員 ID が渡されます。JSF モデルが DOM と一致していないようです。

私は使用しています:

  • TomEE (MyFaces 2.1.7)
  • プライムフェイス モバイル 0.9.3
  • プライムフェイス 3.3

私のバッキングモデルは両方とも @ViewScoped です

<pm:view id="peopleDirView" onload="">
        <pm:header title="People Directory" fixed="true">
        </pm:header>

        <pm:content>
            <h:form id="form">
                <div data-role="fieldcontain">
                    <fieldset data-role="controlgroup">
                        <p:inputText id="searchCriteria" value="#{peopleDirectoryBean.criteria}" type="search"
                            onkeyup="delay(function() {filterResults();}, 500);" />
                    </fieldset>
                </div>

                <p:dataList id="peopleDataList" value="#{peopleDirectoryBean.people}" var="person" rowIndexVar="rowIndex">
                    <p:column>
                        <p:commandLink action="#{peopleDirectoryDetailBean.loadPersonDetail(person.employeeId)}" update=":personDetailView">
                            <img src="/phonedir/people/image/#{person.employeeId}?width=75&amp;height=100" width="90" height="100"
                                onerror="missingImage(this);" id="per-search-picture" />
                            <h1>#{person.nameLast}, #{person.nameFirst}</h1>
                            <p>#{person.deptName}</p>
                            <p>#{person.jobTitle}</p>
                        </p:commandLink>
                    </p:column>
                </p:dataList>
                <p:remoteCommand name="filterResults" update="peopleDataList" action="#{peopleDirectoryBean.peopleSearch}" />
            </h:form>
        </pm:content>

        <pm:footer fixed="true">
            <pm:navBar>
                <p:button value="People" icon="home" href="#peopleDirView?reverse=true" styleClass="ui-btn-active" />
                <p:button value="Locations" icon="info" href="#locationsView?reverse=true" />
                <p:button value="Conference" icon="search" href="#conferenceRoomsView?reverse=true" />
            </pm:navBar>
        </pm:footer>

        <script>
            var delay = (function() {
                var timer = 0;
                return function(callback, ms) {
                    clearTimeout(timer);
                    timer = setTimeout(callback, ms);
                };
            })();

            function missingImage(image) {
                image.onerror = "";
                image.src = "missing-person.jpg";
                return true;
            }
        </script>

</pm:view>
4

1 に答える 1

0

わかりました、間違いは私の側にあったようです。

バッキング Bean では、CDI を実行するコンテナーの機能を利用しようとしていたため、javax.inject.Named (@Named) を使用していました。javax.faces.bean.ManagedBean (@ManagedBean) に変更すると、問題はなくなりました。TomEE のドキュメントでは、@Named をサポートしていると記載されているため、それが何なのかはわかりません。

于 2012-12-21T13:15:49.483 に答える