我对以下内容存在很大疑问:假设我们分别有以下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?
答案 0 :(得分:3)
Knockout不知道您想要传递集合中的对象,它在文档中告诉您它将完成此操作。你无法直接影响这种行为。
上的“注1”答案 1 :(得分:0)
某些敲除绑定会更改绑定上下文。 2个例子是foreach和with。对于绑定的可观察数组中的每个“元素”,重复对具有foreach绑定的元素内元素的任何绑定。在此上下文中,所有绑定都与可观察数组中的元素相关。
现在,当使用单击绑定时,它总是将绑定上下文的当前模型传递给与单击关联的函数。使用普通绑定时,这只是主视图模型。但是,在foreach绑定中,由于绑定上下文已更改为可观察数组中的当前元素,因此当前模型是当前元素。这就是传递它的原因。
我希望这更有意义。