以下是nemesv写的代码分支:
有父节点和嵌套子节点。
以下是父/子节点的示例:
function FormElementNode(children, text, value) {
var self = this;
self.children = ko.observableArray(children);
self.text = ko.observable(text);
self.value = ko.observable(value);
}
这是HTML的结构(没有脚本标签)
<ul>
<li>Parent text value:
Children:
<ul>
<li>Child1 text value</li>
<li>Child2 text value</li>
</li>
我需要通过鼠标点击它来选择一个节点(实际上,通过鼠标点击选择一个li-tags);然后按删除按钮将其删除(代码的最后一行)。我怎么能这样做?
答案 0 :(得分:1)
我认为您可能需要更改视图模型:在observableArray中创建一个包含root父列表的新模型。然后,您将能够绑定每个元素的单击(单击要删除的元素),并将函数绑定到单击“删除我”。
以下是一个例子:
var Element = function(children, text, value) {
var self = this;
self.text = ko.observable(text);
self.value = ko.observable(value);
self.children = ko.observableArray([]);
if(children) {
for(var i = 0; i < children.length; i++) {
var child = children[i];
self.children.push(new Element(child.children, child.text, child.value));
}
}
}
var Model = function(data) {
var self = this;
this.els = ko.observableArray([]);
this.currentClicked = null;
for(var i = 0; i < data.length; i++) {
var element = data[i]
var el = new Element(element.children, element.text, element.value);
self.els.push(el);
}
this.click = function(el) {
self.currentClicked = el;
}
this.remove = function() {
self.els.remove(self.currentClicked);
for(var i = 0; i < self.els().length; i++) {
self.findAndRemove(self.els()[i], self.currentClicked);
}
}
this.findAndRemove = function(element, toFind) {
element.children.remove(toFind);
for(var i = 0; i < element.children().length; i++) {
self.findAndRemove(element.children()[i], toFind);
}
}
}
这个例子显然没有优化,但这可以让你了解我的意思。这是一个相应的jsfiddle:http://jsfiddle.net/JHK8b/1/您可以单击任何元素名称,然后单击“删除我”。