Jsf getRowData和getRowKey从未执行LazyDataModel
我试过很多事情,我知道。这个线程与另一个线程相关,但现在问题更具体了。我发现方法Jsf getRowData和getRowKey从未执行LazyDataModel,jsf,primefaces,Jsf,Primefaces,我试过很多事情,我知道。这个线程与另一个线程相关,但现在问题更具体了。我发现方法getRowData()以及如果我实现它getRowKey()不会被调用 我所尝试的: 在我的.xhtml中,我设置了rowKey,一切正常。没有编译器错误。在控制器中,我写下getRowData()。我试图选择一些东西,这会破坏整个页面。二传手没有接到电话。如果我不覆盖getRowData()编译器仍然可以工作 当我尝试在控制器中实现getRowKey()和getRowData()时,它告诉我。。。异常[getRo
getRowData()
以及如果我实现它getRowKey()
不会被调用
我所尝试的:
在我的.xhtml中,我设置了rowKey,一切正常。没有编译器错误。在控制器中,我写下getRowData()
。我试图选择一些东西,这会破坏整个页面。二传手没有接到电话。如果我不覆盖getRowData()
编译器仍然可以工作
当我尝试在控制器中实现getRowKey()
和getRowData()
时,它告诉我。。。异常[getRowKey(T对象)必须由…实现。
然后我尝试实现SelectableDataModel
,看看是否有任何区别,但没有区别
当我删除selectionMode
时,整个选择都很好。分页效果很好。编辑列也很好。但是删除条目所需的上下文菜单不起作用
xhtml:
<h:form id="eintraegeList">
<p:panel header="Liste aller Einträge">
<p:dataTable id="table"
var="telefonbuch"
lazy="true"
widgetVar="tableWv"
value="#{telefonbuchList.lazyModel}"
editable="true"
resizableColumns="true"
liveResize="true"
style="margin-bottom:20px"
paginator="true"
rows="#{telefonbuchList.pageSize}"
emptyMessage="Keine Telefonbucheinträge vorhanden"
selectionMode="single"
selection="#{telefonbuchList.selectedEntry}"
rowKey="#{telefonbuch.id}"
currentPageReportTemplate="{startRecord}-{endRecord} von {totalRecords}"
paginatorTemplate="{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}"
rowsPerPageTemplate="5,8,10">
<f:facet name="header">
<p:commandButton id="toggler" type="button" value="Anzeige" style="float:right" icon="pi pi-align-justify" />
<p:columnToggler datasource="table" trigger="toggler" />
</f:facet>
<p:ajax event="rowEdit" listener="#{telefonbuchList.onRowEdit}" update="table" />
<p:ajax event="rowEditCancel" listener="#{telefonbuchList.onRowCancel}" update="table" />
<p:ajax event="cellEdit" listener="#{telefonbuchList.onCellEdit}" update="table" />
<p:ajax event="rowSelect" listener="#{telefonbuchList.onRowSelect}" update="table" />
<p:separator />
<p:column headerText="ID" sortBy="#{telefonbuch.id}">
<h:outputText value="#{telefonbuch.id}" />
</p:column>
<p:column headerText="Vorname" sortBy="#{telefonbuch.vorname}">
<p:cellEditor>
<f:facet name="output"><h:outputText value="#{telefonbuch.vorname}" /></f:facet>
<f:facet name="input"><p:inputText id="vornameInput" value="#{telefonbuch.vorname}" style="width:100%"/></f:facet>
</p:cellEditor>
</p:column>
<p:column headerText="Nachname" sortBy="#{telefonbuch.nachname}">
<p:cellEditor>
<f:facet name="output"><h:outputText value="#{telefonbuch.nachname}" /></f:facet>
<f:facet name="input"><p:inputText id="nachnameInput" value="#{telefonbuch.nachname}" style="width:100%"/></f:facet>
</p:cellEditor>
</p:column>
<p:column headerText="Telefonnummer" sortBy="#{telefonbuch.telefonnummer}">
<p:cellEditor>
<f:facet name="output"><h:outputText value="#{telefonbuch.telefonnummer}" /></f:facet>
<f:facet name="input"><p:inputText id="telefonnummerInput" value="#{telefonbuch.telefonnummer}" style="width:100%"/></f:facet>
</p:cellEditor>
</p:column>
<p:column headerText="Handynummer" sortBy="#{telefonbuch.handynummer}">
<p:cellEditor>
<f:facet name="output"><h:outputText value="#{telefonbuch.handynummer}" /></f:facet>
<f:facet name="input"><p:inputText id="handynummerInput" value="#{telefonbuch.handynummer}" style="width:100%"/></f:facet>
</p:cellEditor>
</p:column>
<p:column headerText="Geschäftsstelle" sortBy="#{telefonbuch.geschaeftsstelle}">
<p:cellEditor>
<f:facet name="output"><h:outputText value="#{telefonbuch.geschaeftsstelle}" /></f:facet>
<f:facet name="input">
<p:selectOneMenu value="#{telefonbuch.geschaeftsstelle}" style="width:100%">
<f:selectItems value="#{telefonbuchController.geschaeftsstellen}" var="c" itemLabel="#{geschaeftsstelle}" itemValue="#{geschaeftsstelle}"/>
</p:selectOneMenu>
</f:facet>
</p:cellEditor>
</p:column>
<p:column headerText="Geschlecht" sortBy="#{telefonbuch.gender.shortGender}">
<p:cellEditor>
<f:facet name="output"><h:outputText value="#{telefonbuch.gender.shortGender}" /></f:facet>
<f:facet name="input">
<p:selectOneMenu id="gender" value="#{telefonbuch.gender}" style="width:100%">
<f:selectItem itemLabel="Keine Angabe" itemValue="" />
<f:selectItems value="#{telefonbuch.genders}" var="gender" itemLabel="#{gender.shortGender}" itemValue="#{gender}"/>
</p:selectOneMenu>
</f:facet>
</p:cellEditor>
</p:column>
<p:column exportable="false" style="width:20px;text-align:center;">
<p:rowEditor />
</p:column>
</p:dataTable>
<p:growl id="growl" showDetail="true" for="eintraege-list">
<p:autoUpdate />
</p:growl>
<p:separator />
<p:contextMenu for="table">
<p:menuitem value="Löschen" update="table" icon="fas fa-eraser" action="#{telefonbuchList.deleteEntry}"/>
<p:menuitem value="Edit Cell" icon="pi pi-search" onclick="PF('tableWv').showCellEditor();return false;"/>
</p:contextMenu>
</p:panel>
</h:form>
- PrimeFaces版本6.2
- JSF MyFaces版本2.2.12
- Java 1.8
- 弹簧靴2.1.3
TelefonbuchListController.loadData() {
lazyModel = new LazyDataModel<Telefonbuch>() {
//...
}
您在问题中提出的两种方法getRowKey
和getRowData
都属于LazyDataModel
实现,该实现未分配给p:dataTable
value
属性。因此,这两种方法都不会被调用。如果是分配给p:dataTable
LazyDataModel
ode>value属性,您的p:dataTable
可能看起来像这样:
public void loadData() {
lazyModel = new LazyDataModel<Telefonbuch>() {
// ...
@Override
public Telefonbuch getRowData(String rowKey) {
// your implementation here
}
@Override
public Object getRowKey(Telefonbuch telefonbuch) {
// your implementation here
}
// ...
}
<p:dataTable id="table"
var="telefonbuch"
lazy="true"
widgetVar="tableWv"
value="#{telefonbuchList}"
...
我想这也是我的解决方案,但有人能解释一下这是什么意思吗:jobRequestController.lazyModel是应该实现这种方法的数据模型,而不是jobRequestController本身
对我来说,这将是一个不同的控制器名,但同样的问题。那么如何实现它呢?
public void loadData() {
lazyModel = new LazyDataModel<Telefonbuch>() {
// ...
@Override
public Telefonbuch getRowData(String rowKey) {
// your implementation here
}
@Override
public Object getRowKey(Telefonbuch telefonbuch) {
// your implementation here
}
// ...
}
<p:dataTable id="table"
var="telefonbuch"
lazy="true"
widgetVar="tableWv"
value="#{telefonbuchList}"
...