Knockout JS如何知道要传递的正确参数?

时间:2014-02-04 14:08:21

标签: javascript knockout.js

我对以下内容存在很大疑问:假设我们分别有以下viewmodel和view

function TableViewModel() {
    var self = this;

    self.someObservableCollection = ko.observableArray();

    self.doWorkWithObjectInCollection(collectionObject) {
        /* Code to process the collectionObject */
    }
}

ko.applyBindings(new TableViewModel());

视图就是这样(假设我们还运行了一个函数来获取集合的初始数据):

<table>
    <thead> <!-- Table head here --> </thead>
    <tbody data-bind="foreach: someObservableCollection">
        <tr>
            <td data-bind="text: property1"></td>
            <td data-bind="text: property2"></td>
            <!-- ... -->
            <td><a data-bind="click: $parent.doWorkWithObjectInCollection">Do Work</a></td>
        </tr>
    </tbody>
</table>

现在,非常有趣的是,当单击Do Work链接时,函数doWorkWithObjectInCollection被称为并且传递的参数是当前行中使用的对象。

Knockout如何知道我们要传递的参数是foreach循环中的当前对象?在其他情况下,我怎么知道knockout将作为参数传递给某个事件上调用的函数,例如click?

2 个答案:

答案 0 :(得分:3)

Knockout不知道您想要传递集合中的对象,它在文档中告诉您它将完成此操作。你无法直接影响这种行为。

请参阅http://knockoutjs.com/documentation/click-binding.html

上的“注1”

答案 1 :(得分:0)

某些敲除绑定会更改绑定上下文。 2个例子是foreach和with。对于绑定的可观察数组中的每个“元素”,重复对具有foreach绑定的元素内元素的任何绑定。在此上下文中,所有绑定都与可观察数组中的元素相关。

现在,当使用单击绑定时,它总是将绑定上下文的当前模型传递给与单击关联的函数。使用普通绑定时,这只是主视图模型。但是,在foreach绑定中,由于绑定上下文已更改为可观察数组中的当前元素,因此当前模型是当前元素。这就是传递它的原因。

我希望这更有意义。