1

我正在开发 PrimFaces 移动员工目录应用程序,但遇到了障碍。它是一个简单的应用程序,由两个屏幕组成(员工过滤器/列表 + 员工详细信息)。

我能够毫无问题地加载数据列表。单击命令链接会正确加载员工详细信息。然后我能够实现一个自定义的员工过滤器,这有点痛苦,但我得到了它的工作。过滤器通过使用过滤结果重新填充员工数据列表的模型来工作。

问题是,在我使用过滤器重新填充/过滤数据列表后,单击员工(commandlink)不会将正确的员工 ID 传递回模型。而是传递执行过滤器之前存在的员工 ID。就像 JSF 模型与 DOM 不匹配一样。

我在用着:

  • TomEE (MyFaces 2.1.7)
  • PrimeFaces 移动版 0.9.3
  • PrimeFaces 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 中,我使用了 javax.inject.Named (@Named),因为我试图利用我的容器执行 CDI 的能力。一旦我将其更改为 javax.faces.bean.ManagedBean (@ManagedBean ),问题就消失了。TomEE 文档声明它支持@Named,所以我不确定这笔交易是什么。

于 2012-12-21T13:15:49.483 回答