找到"主要对象" a.k.a. contextof使用默认的applyBindings

时间:2014-05-20 13:30:37

标签: knockout.js

在我将绑定应用于没有特定DOM元素的情况下,我尝试获取绑定视图模型。我不想使用变量来保存我的VM,也不想使用特定于DOM的绑定。

因此,如果我不使用变量来存储我的VM,也不使用特定的DOM节点作为绑定上下文,我该如何获取该对象?

这是我尝试过的:

ko.applyBindings(new PageViewMode());

// ... some code ...

var vm = ko.contextFor(document); // this is what I want. I guessed it would bee bound to document or body element, but not!!

vm.load(); // this cannot be done because there is no load method on "undefined" vm

使用变量,它就像一个魅力:

var vm = new PageViewMode();

ko.applyBindings(vm);

// ... some code ...

vm.load(); // OK with variable

1 个答案:

答案 0 :(得分:0)

如果您在没有参数的情况下调用ko.applyBindings,则视图模型将绑定到body标记。

Repro

ko.applyBindings({});
console.log(ko.contextFor(document.body));

保存对视图模型变量的引用并将其传递给函数并在某个闭包中确定范围可能更好。

PS。 Knockout是开源的,所以你可以verify this in the source。简短的引用:

ko.applyBindings = function (viewModelOrBindingContext, rootNode) {
    // If jQuery is loaded after Knockout, we won't initially have access to it. So save it here.
    if (!jQueryInstance && window['jQuery']) {
        jQueryInstance = window['jQuery'];
    }

    if (rootNode && (rootNode.nodeType !== 1) && (rootNode.nodeType !== 8))
        throw new Error("ko.applyBindings: first parameter should be your view model; second parameter should be a DOM node");
    rootNode = rootNode || window.document.body; // Make "rootNode" parameter optional

    applyBindingsToNodeAndDescendantsInternal(getBindingContext(viewModelOrBindingContext), rootNode, true);
};