这并不是指observableArray模板绑定中的viewmodel

时间:2012-02-13 16:42:45

标签: javascript knockout.js

尝试在Knockout 2中使用新的cleaner event handling以及新的控制流绑定我正在实现一个简单的动态列表,添加和删除字符串。所以我的标记大致如下:

<div data-bind="foreach:myList">
    <input data-bind="value: $data" />
    <button data-bind="click:$parent.removeFromList">X</button>
</div>

我的viewmodel有一个匹配的删除函数,它模仿a sample from Steve Sanderson

removeFromList: function(item) {
    this.myList.remove(item);
}

现在我希望'this'引用viewmodel和item来引用要删除的数组成员(从event handlers now receive the current model value as their first parameter开始)。但是,'this'似乎也指的是被删除的字符串。因此,当我点击删除时,我得到:

this.myList is undefined

我在http://jsfiddle.net/davidc/rFd7H/创建了一个JSFiddle来说明我的问题。我该如何从列表中删除项目?

1 个答案:

答案 0 :(得分:1)

有许多方法可以确保您的处理程序具有正确的“this”值。

  1. 在函数中构建视图模型,并对当前bind示例使用thishttp://jsfiddle.net/rniemeyer/rFd7H/4/。或者,不要在函数中构建视图模型,并使用bind,例如:http://jsfiddle.net/rniemeyer/rFd7H/10/

  2. 在函数中构建视图模型,并使用正确的this值保存变量,并在处理程序中使用它。示例:http://jsfiddle.net/rniemeyer/rFd7H/5/

  3. 绑定到绑定中的正确上下文,例如:data-bind="click: $parent.removeFromList.bind($parent)"示例:http://jsfiddle.net/rniemeyer/rFd7H/8/

  4. 将其称为$parent对象的匿名函数,如:data-bind="function() { $parent.removeFromList($data); }"一般情况下,不推荐使用,因为它会使标记变得丑陋/冗长。示例:http://jsfiddle.net/rniemeyer/rFd7H/9/