Knockout Mapping插件 - 捕获数组值

时间:2012-07-31 07:15:02

标签: javascript jquery arrays json knockout.js

我有一个来自REST API的JSON数组。我正在使用Knockout映射插件来处理数组并将JSON加载到预设的表单值(如果用户之前已经向表单添加了值 - 我在那里有数据来测试Knockout数组)。该表单实际上添加或删除了带输入的div块,因此用户可以添加/删除“工作”体验。

我的麻烦在于尝试破译插件如何映射数组。我试图找到数组中一行的特定值(id),以便我可以将其添加为变量,以告诉API删除该特定行。我可以让Knockout在html中显式输出行值,但我无法弄清楚如何捕获它。在模板“foreach”中,我有一个引用“remove:”的按钮,这就是我在尝试从数组中捕获值时遇到的问题。

HTML中的示例:

这输出两行“work”对象没问题:

<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模板生成的删除按钮......

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”方面有关,但是我不确定映射插件是做什么的,这样我就可以从数组中捕获特定的值...有意义吗?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

我在这里走出困境,但我确实认为这是问题所在。在Javascript中确定范围有时会很麻烦。尝试在包含去掉函数的范围内执行类似的操作:

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

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