dijit 树无法从崩溃树中获取 child
dijit tree not able to get child from collapase tree
我的道场树很大。我需要一次扩展一个节点以提高性能。我的树有复选框。当检查 parent 节点时,我需要知道 parent 的所有 child ,还有子 child 直到树的叶子。由于树未展开,我无法使用以下代码获得 child。
onClick: function(item, node) {
var childTreeNode = node.getChildren();
}
在这种情况下,如何获取 child 和子 child 详细信息。
下面的 fiddle link 包含树。
http://jsfiddle.net/pyz9Lcpv/11/
HTML代码:
<div id="contentHere"></div>
<div id="contentButton">
<button>Try it</button>
</div>
JavaScript:
require([
"dojo/_base/window", "dojo/store/Memory",
"dijit/tree/ObjectStoreModel",
"dijit/Tree", "dijit/form/CheckBox", "dojo/dom",
"dojo/domReady!"], function (win, Memory, ObjectStoreModel, Tree, checkBox, dom) {
// Create test store, adding the getChildren() method required by ObjectStoreModel
var myStore = new Memory({
data: [{
id: 'world',
name: 'The earth',
type: 'planet',
population: '6 billion'
}, {
id: 'AF',
name: 'Africa',
type: 'continent',
population: '900 million',
area: '30,221,532 sq km',
timezone: '-1 UTC to +4 UTC',
parent: 'world'
}, {
id: 'EG',
name: 'Egypt',
type: 'country',
parent: 'AF'
}, {
id: 'KE',
name: 'Kenya',
type: 'country',
parent: 'AF'
}, {
id: 'Nairobi',
name: 'Nairobi',
type: 'city',
parent: 'KE'
}, {
id: 'Mombasa',
name: 'Mombasa',
type: 'city',
parent: 'KE'
}, {
id: 'SD',
name: 'Sudan',
type: 'country',
parent: 'AF'
}, {
id: 'Khartoum',
name: 'Khartoum',
type: 'city',
parent: 'SD'
}, {
id: 'AS',
name: 'Asia',
type: 'continent',
parent: 'world'
}, {
id: 'CN',
name: 'China',
type: 'country',
parent: 'AS'
}, {
id: 'IN',
name: 'India',
type: 'country',
parent: 'AS'
}, {
id: 'RU',
name: 'Russia',
type: 'country',
parent: 'AS'
}, {
id: 'MN',
name: 'Mongolia',
type: 'country',
parent: 'AS'
}, {
id: 'OC',
name: 'Oceania',
type: 'continent',
population: '21 million',
parent: 'world'
}, {
id: 'EU',
name: 'Europe',
type: 'continent',
parent: 'world'
}, {
id: 'DE',
name: 'Germany',
type: 'country',
parent: 'EU'
}, {
id: 'FR',
name: 'France',
type: 'country',
parent: 'EU'
}, {
id: 'ES',
name: 'Spain',
type: 'country',
parent: 'EU'
}, {
id: 'IT',
name: 'Italy',
type: 'country',
parent: 'EU'
}, {
id: 'RU',
name: 'Russia',
type: 'country',
parent: 'EU'
}, {
id: 'NA',
name: 'North America',
type: 'continent',
parent: 'world'
}, {
id: 'SA',
name: 'South America',
type: 'continent',
parent: 'world'
}],
getChildren: function (object) {
return this.query({
parent: object.id
});
}
});
// Create the model
var myModel = new ObjectStoreModel({
store: myStore,
query: {
id: 'world'
}
});
// Create the Tree.
var tree = new Tree({
model: myModel,
getIconClass: function (item, opened) {
// console.log('tree getIconClass', item, opened);
// console.log('tree item type', item.type);
},
onClick: function (item, node) {
node._iconClass = "dijitFolderClosed";
node.iconNode.className = "dijitFolderClosed";
console.log(node.domNode.id);
var id = node.domNode.id,
isNodeSelected = node.checkBox.get('checked');
console.log(isNodeSelected);
checkTheChild(node, isNodeSelected);
/*dojo.query('#'+id+' .dijitCheckBox').forEach(function(node){
console.log("node in checkbox :"+node);
dijit.getEnclosingWidget(node).set('checked',isNodeSelected);
});*/
},
_createTreeNode: function (args) {
var tnode = new dijit._TreeNode(args);
tnode.labelNode.innerHTML = args.label;
console.log(args);
var cb = new dijit.form.CheckBox();
cb.placeAt(tnode.labelNode, "first");
tnode.checkBox = cb;
return tnode;
}
});
tree.placeAt(contentHere);
tree.startup();
//tree.expandAll();
var nodeMap = tree._itemNodesMap;
});
function retrievInfo() {
dojo.query('.dijitChecked').forEach(function (node) {
dojo.query('#nodeContent')[0].innerHTML += node.parentNode.parentNode.textContent;
//dojo.query('#nodeContent')[0].innerHTML += node.label;
var treeNode = dijit.getEnclosingWidget(this.domNode.parentNode);
console.log(node.parentNode.parentNode.textContent);
console.log(node.parentNode.parentNode.textContent);
var nodeMap = tree._itemNodesMap;
});
}
function checkTheChild(node1, isNodeSelected1) {
console.log(node1);
console.log(isNodeSelected1);
var childTreeNode = node1.getChildren();
var x;
if (childTreeNode.length > 0) {
//for(i=0;i<childTreeNode.length;i++){
for (x in childTreeNode) {
//childTreeNode[i].checkBox.checked = true;
childTreeNode[x].checkBox.setAttribute('checked', isNodeSelected1);
//dijit.getEnclosingWidget(node1.domNode).set('checked',isNodeSelected1);
if (childTreeNode[x].getChildren().length > 0) {
checkTheChild(childTreeNode[x], isNodeSelected1);
}
}
} else {
return;
}
}
我们可以递归地使用 getChildren 函数来获取所有子节点(直到叶节点)。
onClick: function(item, node) {
this.getChildItems(item);
},
getChildItems: function(item) {
dojo.forEach(this.model.store.getChildren(item),
function(node) {
console.log(node);
this.getChildItems(node);
}, this);
}
谢谢
斯里坎特
我的道场树很大。我需要一次扩展一个节点以提高性能。我的树有复选框。当检查 parent 节点时,我需要知道 parent 的所有 child ,还有子 child 直到树的叶子。由于树未展开,我无法使用以下代码获得 child。
onClick: function(item, node) {
var childTreeNode = node.getChildren();
}
在这种情况下,如何获取 child 和子 child 详细信息。
下面的 fiddle link 包含树。
http://jsfiddle.net/pyz9Lcpv/11/
HTML代码:
<div id="contentHere"></div>
<div id="contentButton">
<button>Try it</button>
</div>
JavaScript:
require([
"dojo/_base/window", "dojo/store/Memory",
"dijit/tree/ObjectStoreModel",
"dijit/Tree", "dijit/form/CheckBox", "dojo/dom",
"dojo/domReady!"], function (win, Memory, ObjectStoreModel, Tree, checkBox, dom) {
// Create test store, adding the getChildren() method required by ObjectStoreModel
var myStore = new Memory({
data: [{
id: 'world',
name: 'The earth',
type: 'planet',
population: '6 billion'
}, {
id: 'AF',
name: 'Africa',
type: 'continent',
population: '900 million',
area: '30,221,532 sq km',
timezone: '-1 UTC to +4 UTC',
parent: 'world'
}, {
id: 'EG',
name: 'Egypt',
type: 'country',
parent: 'AF'
}, {
id: 'KE',
name: 'Kenya',
type: 'country',
parent: 'AF'
}, {
id: 'Nairobi',
name: 'Nairobi',
type: 'city',
parent: 'KE'
}, {
id: 'Mombasa',
name: 'Mombasa',
type: 'city',
parent: 'KE'
}, {
id: 'SD',
name: 'Sudan',
type: 'country',
parent: 'AF'
}, {
id: 'Khartoum',
name: 'Khartoum',
type: 'city',
parent: 'SD'
}, {
id: 'AS',
name: 'Asia',
type: 'continent',
parent: 'world'
}, {
id: 'CN',
name: 'China',
type: 'country',
parent: 'AS'
}, {
id: 'IN',
name: 'India',
type: 'country',
parent: 'AS'
}, {
id: 'RU',
name: 'Russia',
type: 'country',
parent: 'AS'
}, {
id: 'MN',
name: 'Mongolia',
type: 'country',
parent: 'AS'
}, {
id: 'OC',
name: 'Oceania',
type: 'continent',
population: '21 million',
parent: 'world'
}, {
id: 'EU',
name: 'Europe',
type: 'continent',
parent: 'world'
}, {
id: 'DE',
name: 'Germany',
type: 'country',
parent: 'EU'
}, {
id: 'FR',
name: 'France',
type: 'country',
parent: 'EU'
}, {
id: 'ES',
name: 'Spain',
type: 'country',
parent: 'EU'
}, {
id: 'IT',
name: 'Italy',
type: 'country',
parent: 'EU'
}, {
id: 'RU',
name: 'Russia',
type: 'country',
parent: 'EU'
}, {
id: 'NA',
name: 'North America',
type: 'continent',
parent: 'world'
}, {
id: 'SA',
name: 'South America',
type: 'continent',
parent: 'world'
}],
getChildren: function (object) {
return this.query({
parent: object.id
});
}
});
// Create the model
var myModel = new ObjectStoreModel({
store: myStore,
query: {
id: 'world'
}
});
// Create the Tree.
var tree = new Tree({
model: myModel,
getIconClass: function (item, opened) {
// console.log('tree getIconClass', item, opened);
// console.log('tree item type', item.type);
},
onClick: function (item, node) {
node._iconClass = "dijitFolderClosed";
node.iconNode.className = "dijitFolderClosed";
console.log(node.domNode.id);
var id = node.domNode.id,
isNodeSelected = node.checkBox.get('checked');
console.log(isNodeSelected);
checkTheChild(node, isNodeSelected);
/*dojo.query('#'+id+' .dijitCheckBox').forEach(function(node){
console.log("node in checkbox :"+node);
dijit.getEnclosingWidget(node).set('checked',isNodeSelected);
});*/
},
_createTreeNode: function (args) {
var tnode = new dijit._TreeNode(args);
tnode.labelNode.innerHTML = args.label;
console.log(args);
var cb = new dijit.form.CheckBox();
cb.placeAt(tnode.labelNode, "first");
tnode.checkBox = cb;
return tnode;
}
});
tree.placeAt(contentHere);
tree.startup();
//tree.expandAll();
var nodeMap = tree._itemNodesMap;
});
function retrievInfo() {
dojo.query('.dijitChecked').forEach(function (node) {
dojo.query('#nodeContent')[0].innerHTML += node.parentNode.parentNode.textContent;
//dojo.query('#nodeContent')[0].innerHTML += node.label;
var treeNode = dijit.getEnclosingWidget(this.domNode.parentNode);
console.log(node.parentNode.parentNode.textContent);
console.log(node.parentNode.parentNode.textContent);
var nodeMap = tree._itemNodesMap;
});
}
function checkTheChild(node1, isNodeSelected1) {
console.log(node1);
console.log(isNodeSelected1);
var childTreeNode = node1.getChildren();
var x;
if (childTreeNode.length > 0) {
//for(i=0;i<childTreeNode.length;i++){
for (x in childTreeNode) {
//childTreeNode[i].checkBox.checked = true;
childTreeNode[x].checkBox.setAttribute('checked', isNodeSelected1);
//dijit.getEnclosingWidget(node1.domNode).set('checked',isNodeSelected1);
if (childTreeNode[x].getChildren().length > 0) {
checkTheChild(childTreeNode[x], isNodeSelected1);
}
}
} else {
return;
}
}
我们可以递归地使用 getChildren 函数来获取所有子节点(直到叶节点)。
onClick: function(item, node) {
this.getChildItems(item);
},
getChildItems: function(item) {
dojo.forEach(this.model.store.getChildren(item),
function(node) {
console.log(node);
this.getChildItems(node);
}, this);
}
谢谢 斯里坎特