Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在Knockout.js中,如何连接事件/按钮以删除嵌套observableArray中的元素_Javascript_Knockout.js_Knockout Mapping Plugin - Fatal编程技术网

Javascript 在Knockout.js中,如何连接事件/按钮以删除嵌套observableArray中的元素

Javascript 在Knockout.js中,如何连接事件/按钮以删除嵌套observableArray中的元素,javascript,knockout.js,knockout-mapping-plugin,Javascript,Knockout.js,Knockout Mapping Plugin,以下是nemesv编写的一段代码: 有一个父节点和嵌套的子节点 以下是父/子节点的示例: function FormElementNode(children, text, value) { var self = this; self.children = ko.observableArray(children); self.text = ko.observable(text); self.value = ko.observable(value); } 下面是HTM

以下是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的结构(没有脚本标记)

  • 父文本值: 儿童:
    • Child1文本值
    • Child2文本值

我需要能够通过鼠标点击来选择一个节点(实际上,通过鼠标点击来选择一个li标签);然后按delete按钮将其删除(代码的最后一行)。我该怎么做呢?

我认为您可能必须更改视图模型:创建一个新模型,其中包含一个observableArray中的根父级列表。然后,您将能够绑定对每个元素的单击(单击要删除的元素),并将函数绑定到单击“删除我”上

以下是一个例子:

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);
        }
    }

}
var元素=函数(子项、文本、值){
var self=这个;
self.text=ko.可观察(text);
自我价值=可观察到的价值;
self.children=ko.observearray([]);
if(儿童){
对于(变量i=0;i

这个例子显然没有经过优化,但这可以让你了解我的意思。下面是一个对应的JSFIDLE:您可以单击任何元素名称,然后单击“删除我”。

如何选择要删除的节点?你能提供一个完整的代码来显示你想做什么吗?@mael你点击itOk。但是您能否提供更完整的代码(例如,JSFIDLE)?很难理解你想做什么。@mael:说得好。我通过fiddler提供了完整的示例代码,coment基于此。这是基于nemesv的工作
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);
        }
    }

}