Knockout映射插件-捕获数组值



我有一个来自REST API的JSON数组。我正在使用Knockout映射插件来处理数组,并将JSON加载到预设的表单值中(如果用户以前已经向表单添加了值——我在那里有数据来测试Knockout数组)。表单本质上是添加或删除带有输入的div块,这样用户就可以添加/删除"工作"体验。

我的问题是试图破解插件如何映射数组。我正在尝试在数组中查找某行的特定值(id),以便将其作为变量添加,以告诉API删除该特定行。我可以让Knockout显式地输出html中的行值,但我不知道如何捕获它。在模板"foreach"中,我有一个引用"remove:"的按钮,这就是我试图从数组中捕获值的地方。

例如HTML中的示例:

这输出两行"工作"对象没有问题:

<span data-bind="text: ko.mapping.toJSON(workModel.work())"></span>
[{"id":"1","schoolID":"2","place":"","position":"Science Teacher","description":"I worked at ASD for 1 year as a Science teacher.","start":"2011","end":"2012","profileID":"91"},{"id":"2","schoolID":"1","place":"American School of Taiwan","position":"Science Guy","description":"I was just another science guy","start":"2008","end":"2011","profileID":"91"}]

这会输出数组中第一行和项目的id:

<span data-bind="text: ko.mapping.toJSON(workModel.work()[0].id)"></span>
"1"

但是在javascript中,如果您单击foreach模板生成的remove按钮。。。

gone = function(work) {
        alert(ko.mapping.toJSON(workModel.work(this).id)); 
     } 

在Firebug中给了我这个错误,然后UI重新加载并删除了我刚刚点击的模板块。

Unable to parse bindings. Message: TypeError: workModel.work()[0] is undefined; Bindings value: text: ko.mapping.toJSON(workModel.work()[0].id)

尽管如此,如果我用明确的语句替换上述警报:

gone = function(work) {
         alert(ko.mapping.toJSON(workModel.work()[0].id)); 
         } 

我又得到了"1"的正确值。我知道这与代码的"this"方面有关,但我不确定映射插件在做什么,以便从数组中捕获特定值。。。有道理吗?如有任何帮助,我们将不胜感激。

我要冒险了,但我确实认为是这个问题。Javascript中的作用域有时会很麻烦。尝试在包含gone函数的作用域中执行类似操作:

var self = this;
gone = function(work) {
    alert(ko.mapping.toJSON(workModel.work(self).id)); 
} 

免责声明:我现在无法自己测试,但请尝试一下:)

我终于得到了它。它来自于Stack Overflow上的不同帖子和Knockout论坛。我相信其他人有比这更优雅的解决方案,但它对我有效。

在"Delete"(或任何你想用来捕获值的按钮)按钮上的foreach循环中,我在数据绑定上包含了以下内容:

<a href="" class="btn" data-bind="click: function() { remove($data.id()); }">Remove</a> 

然后在javascript中我有:

var self = this;
var row_id;
self.remove = function(index){
            var row_id = index;
            alert(row_id);
    }

该警报根据我的需要返回加载的JSON的行ID。$data.id()可以更改/用于从加载的JSON返回任何映射的元素。row_id是一个全局值,也可以在其他地方访问。

最新更新