有一个包含p:inputText
的p:dataTable
表格:
<h:form id="form">
<p:dataTable id="dataTable" value="#{rowReorder.dataList}"
var="row" draggableRows="true" rowKey="#{row.id}">
<p:ajax event="rowReorder" listener="#{rowReorder.reorder}" update="dataTable"/>
<p:column>
<f:facet name="header">
<p:commandButton value="Add" actionListener="#{rowReorder.addData}"
update="dataTable" process="dataTable"/>
</f:facet>
<p:outputLabel value="#{row.id}"/>
</p:column>
<p:column>
<p:inputText value="#{row.name}"/>
</p:column>
</p:dataTable>
</h:form>
后端Bean:
import org.omnifaces.cdi.ViewScoped;
import org.primefaces.event.ReorderEvent;
import javax.inject.Named;
import java.io.Serializable;
import java.util.LinkedList;
import java.util.List;
@Named("rowReorder")
@ViewScoped
public class RowReorder implements Serializable {
private List<Data> dataList = new LinkedList<>();
public void addData() {
Data data = new Data();
data.setId(dataList.size() + 1);
data.setName("Data " + data.getId());
dataList.add(data);
}
public void reorder(ReorderEvent event) {
}
/**
* Getters, Setters
*/
public List<Data> getDataList() {
return dataList;
}
}
数据类:
public class Data implements Serializable {
private Integer id;
private String name;
/**
* Getters, Setters
*/
}
重新排序之前的样本数据表:
--------------
|id | name |
--------------
| 1 | Data 1 |
| 2 | Data 2 |
| 3 | Data 3 |
| 4 | Data 4 |
--------------
在重新排序之后(将第一行移动到第三行):
--------------
|id | name |
--------------
| 2 | Data 1 |
| 3 | Data 2 |
| 1 | Data 3 |
| 4 | Data 4 |
--------------
我理解这是由于在UPDATE_MODEL
阶段从p:inputText
设置数据导致的。我尝试通过在p:ajax
组件中指定process="@none"
来防止处理输入字段,但它不起作用。你知道如何让draggableRows
和p:inputText
结合起来吗?
org.primefaces.component.datatable.feature.DraggableRowsFeature
的decode()
方法中,dataList
的旋转发生在APPLY_REQUEST_VALUES
阶段。而将输入值设置到已经重新排序的dataList
上则发生在UPDATE_MODEL_VALUES
阶段,这就是问题所在。 - antonu17