我有一个来自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”方面有关,但是我不确定映射插件是做什么的,这样我就可以从数组中捕获特定的值...有意义吗?任何帮助将不胜感激。
答案 0 :(得分:0)
我在这里走出困境,但我确实认为这是问题所在。在Javascript中确定范围有时会很麻烦。尝试在包含去掉函数的范围内执行类似的操作:
var self = this;
gone = function(work) {
alert(ko.mapping.toJSON(workModel.work(self).id));
}
免责声明:我现在无法自己测试,但请试一试:)