【发布时间】:2019-04-10 11:43:56
【问题描述】:
我正在从服务工作者提供的数据源填充树视图:
postCreate: function () {
var self = this;
self._loadLayerConfiguration()
.then(function (data) {
self.layerConfig = data;
self._treeView = $("#LayerList").kendoTreeView({
dataValueField: "Id",
dataTextField: "Title",
checkboxes: {
checkChildren: true
},
check: self._onCheck.bind(self),
dataSource: new kendo.data.HierarchicalDataSource({ /*...*/}
})
});
});
},
如您所见,配置已设置,以便检查所有子元素,当检查父元素时,会触发_onCheck 方法。
这个方法现在应该作用于每一个变化的复选框:
_onCheck: function (e) {
var dataItem = this._treeView.data("kendoTreeView").dataItem(e.node);
if (!dataItem.layer && dataItem.Url !== null) { //Url is null, if this is a Group layer
//load FeatureLayer, if not loaded
//load legend, if not loaded
//add to map
//omitted for brevity
}
dataItem.layer.setVisibility(dataItem.checked);
this._checkChildren.call(this, dataItem);
},
这里的问题是,onCheck 事件仅针对用户直接单击的节点触发,而不是针对所有受它影响的子节点。
我曾尝试递归循环遍历 dataItem 的所有子项并手动触发检查事件,但无济于事:
_checkChildren: function (dataItem) {
var self = this;
if (dataItem.hasChildren) {
var children = dataItem.children.data();
children.forEach(function (child) {
child.set("checked", dataItem.checked);
//self._treeView.trigger("check", {
// node: self._treeView.findByUid(child.uid)
//});
if (child.hasChildren) {
//recurse
self._checkChildren.call(self, child);
}
});
}
},
效果是,为树视图中直接更改的复选框引发事件,而不是其子项。孩子们只做检查。 触发受父节点影响的所有子节点的检查事件的正确方法是什么?
请不要对.bind() 和.call() 调用感到恼火。由于这个 kendo 小部件必须在 Dojo 1.10 小部件中实现,因此结构往往会变得有点复杂。
【问题讨论】:
标签: javascript kendo-ui kendo-treeview