模板

时间:2015-07-16 18:03:04

标签: javascript knockout.js

https://jsfiddle.net/btriplett/y3p8cdby/2/

的示例

我在淘汰赛中遇到了与$ parent标签混淆的行为。我正在尝试从上下文中删除列表中的项目,并期望必须使用$ parent标记来访问父视图模型的删除功能(见下文)。

这是标记:

<ul data-bind="foreach: list">
    <li>
        <div>
            <span data-bind="text: name"></span>
            <button data-bind="click: $parent.remove">Remove</button>
        </div>
    </li>
</ul>

这是viewmodel

var data = [ {name: "Bob"}, {name:"Joe"}, {name: "John"}];

function viewModel() {
    var self = this;

    self.list = ko.observableArray(data);

    self.remove = function(item){
        self.list.remove(item);
    };
};

ko.applyBindings(viewModel());

然而,这不起作用。我得到了(在Chrome中使用淘汰赛3.0)。

Uncaught TypeError: Unable to process binding "foreach: function (){return list }"
Message: Unable to process binding "click: function (){return $parent.remove }"
Message: Cannot read property 'remove' of undefined

但是如果我删除了它的$ parent就行了!这完全不是我所期望的,因为列表项的上下文是项而不是viewmodel。有谁知道这是为什么?

2 个答案:

答案 0 :(得分:1)

viewModel是一个应该使用new调用的构造函数。或者(我建议)将其第一行更改为

var self = {};

并像在这里一样打电话。

答案 1 :(得分:0)

以下是一个示例,说明当您忘记在其上调用function ViewModel(params) { if (!(this instanceof ViewModel)) { return new ViewModel(params); } ... } 时,如何使课程不失败。

Private Sub UserForm_Activate()
Dim wkBook As Workbook

For Each wkBook In Workbooks
If Not Windows(wkBook.name).Visible Then
    ListBox1.AddItem wkBook.name
ElseIf Windows(wkBook.name).Visible Then
    ListBox1.AddItem wkBook.name
Else
    ListBox1.AddItem wkBook.name
End If
MsgBox wkBook.name
Next wkBook
End Sub