PrimeFaces树表-停止复选框选择传播
环境:PrimeFaces树表-停止复选框选择传播,primefaces,jsf-2.2,Primefaces,Jsf 2.2,环境: PrimeFaces 6.1 JSF2.2 Tomcat 7.0.23 Java 1.7.0_79 实现了一个带有复选框选择的树表,需要分别防止父节点和子节点的选择向上和向下传播,以进行客户端和服务器端处理 RequestContext.getCurrentInstance().update("inventoryForm:treeTable"); 示例树: 父节点 --子节点1 ----子节点1.1 --子节点2 ----子节点2.1 期望的行为: 选择节点时,只应选中该节点的复选框
PrimeFaces 6.1
JSF2.2
Tomcat 7.0.23
Java 1.7.0_79 实现了一个带有复选框选择的树表,需要分别防止父节点和子节点的选择向上和向下传播,以进行客户端和服务器端处理
RequestContext.getCurrentInstance().update("inventoryForm:treeTable");
示例树:父节点
--子节点1
----子节点1.1
--子节点2
----子节点2.1 期望的行为:
选择节点时,只应选中该节点的复选框 实际行为(开箱即用):
选择节点时,将选择子节点和父节点。例如,在上面的示例树中选择子节点2,也会选择父节点和子节点2.1 树表组件:
<p:treeTable id="treeTable" value="#{Bean.rootNode}" var="item" selectionMode="checkbox" nodeVar="node"
styleClass="widthFull" showUnselectableCheckbox="true" selection="#{Bean.selectedNodes}" stickyHeader="true">
<p:ajax event="select" listener="#{Bean.processSelect(item)}" ignoreAutoUpdate="true"/>
<p:ajax event="unselect" listener="#{Bean.processUnselect(item)}" ignoreAutoUpdate="true"/>
....
</p:treeTable>
树表更新:树表更新作为ajax选择和取消选择事件处理的一部分执行
RequestContext.getCurrentInstance().update("inventoryForm:treeTable");
问题:当ajax select和unselect事件被触发以禁用特定节点上的可选择性并更新树表时,子节点被选中。处理ajax事件侦听器时,子节点不在Bean上的selectedNodes数组中。如何防止在更新TreeTable组件时选择子节点?可以通过扩展CheckboxTreeNode类并重写propagateSelectionDown(布尔)和propagateSelectionUp()方法来防止从服务器端传播复选框选择。当然,然后需要使用新类而不是CheckboxTreeNode构建树内容
public class MyCheckboxTreeNode extends CheckboxTreeNode {
public MyCheckboxTreeNode() {
super();
}
public MyCheckboxTreeNode(Object data, TreeNode parent) {
super(data, parent);
}
public MyCheckboxTreeNode(Object data) {
super(data);
}
public MyCheckboxTreeNode(String type, Object data, TreeNode parent) {
super(type, data, parent);
}
@Override
protected void propagateSelectionDown(boolean value) {
//Do nothing, overriding CheckboxTreeNode method to prevent propagation down of tree node selections when ajax update is performed.
}
@Override
protected void propagateSelectionUp() {
//Do nothing, overriding CheckboxTreeNode method to prevent propagation up of tree node selections when ajax update is performed.
}
}
需要重写额外的PrimeFaces javascript函数,以防止在子节点折叠时向下传播
//--------Override Primefaces JS
PrimeFaces.widget.TreeTable.prototype.fireSelectNodeEvent = function(b) {
//Overriding this function in order to prevent selection of descendant nodes when parent is selected. See a.oncomplete function below.
if (this.isCheckboxSelection()) {
var e = this
, a = {
source: this.id,
process: this.id
};
a.params = [{
name: this.id + "_instantSelection",
value: b
}];
a.oncomplete = function(k, f, g) {
//commented out the logic to prevent selection of descendant nodes when parent node is selected
//if (g.descendantRowKeys && g.descendantRowKeys !== "") {
//var j = g.descendantRowKeys.split(",");
//for (var h = 0; h < j.length; h++) {
//e.addToSelection(j[h])
//}
//e.writeSelections()
//}
}
;
if (this.hasBehavior("select")) {
var d = this.cfg.behaviors.select;
d.call(this, a)
} else {
PrimeFaces.ajax.AjaxRequest(a)
}
} else {
if (this.hasBehavior("select")) {
var d = this.cfg.behaviors.select
, c = {
params: [{
name: this.id + "_instantSelection",
value: b
}]
};
d.call(this, c)
}
}
}
/-----------覆盖Primefaces JS
PrimeFaces.widget.TreeTable.prototype.fireSelectNodeEvent=函数(b){
//重写此函数以防止在选择父节点时选择子节点。请参阅下面的a.oncomplete函数。
if(this.isCheckboxSelection()){
var e=这个
,a={
资料来源:this.id,
进程:this.id
};
a、 参数=[{
名称:this.id+“\u instantSelection”,
价值:b
}];
a、 oncomplete=函数(k,f,g){
//注释掉了在选择父节点时阻止选择子节点的逻辑
//if(g.genderantrowkeys&&g.genderantrowkeys!==“”){
//var j=g.groundantrowkeys.split(“,”);
//对于(var h=0;h
检查树表(渲染器)java代码的功能。。。也许它会在视觉上选择它们there@Kukeltje谢谢你的建议,我会去看看。@Kukeltje再次感谢你的建议,它帮助我找到了解决方案。我能够通过扩展CheckboxTreeNode类并重写propagateSelectionDown和propagateSelectionUp方法来实现复选框传播预防。