【问题标题】:How does Knockout JS knows the right parameter to pass?Knockout JS 如何知道要传递的正确参数?
【发布时间】:2014-02-04 22:45:22
【问题描述】:

我对以下有很大的疑问:假设我们分别有以下视图模型和视图

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循环中的当前对象?而在其他情况下,我怎么知道什么敲除将作为参数传递给在某个事件(如点击)上调用的函数?

【问题讨论】:

    标签: javascript knockout.js


    【解决方案1】:

    Knockout 不知道你想传递集合中的对象,它在文档中告诉你它会这样做。你不能直接影响这种行为。

    参见http://knockoutjs.com/documentation/click-binding.html的“注1”

    【讨论】:

      【解决方案2】:

      某些淘汰赛绑定会更改绑定上下文。 2 个例子是 foreach 和 with。使用 foreach 绑定对元素内的元素进行的任何绑定都会“针对被绑定的可观察数组中的每个”元素重复。在这个上下文中,所有的绑定都是相对于可观察数组中的一个元素。

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

      我希望这更有意义。

      【讨论】:

        猜你喜欢
        • 2014-08-16
        • 1970-01-01
        • 2013-03-14
        • 1970-01-01
        • 2012-03-19
        • 1970-01-01
        • 2014-07-09
        相关资源
        最近更新 更多