我正在开发 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&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>