Я заполняю древовидное представление из источника данных, предоставленного работником сервиса:
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()
. Поскольку этот виджет кендо должен быть реализован в виджете Dojo 1.10, структура имеет тенденцию становиться немного сложной.