为什么我不能从计算属性中访问我的viewmodel?

时间:2013-07-03 15:08:19

标签: knockout.js

对于单页面应用程序,我需要同时使用多个ViewModel,但似乎无法从另一个的计算属性中访问不同的ViewModel。

(非常简化)的例子是:(http://jsfiddle.net/5t2tb/14/

HTML:

<div data-bind="foreach: Search.results">
    <a data-bind="text: id, css: { IsInBookshelf: IsInBookshelf() }"></a>
</div>

的javascript:

var ViewModels = {
    Search: new SearchViewModel()
};

function SearchViewModel() {
    this.results = ko.observableArray([new Book(123), new Book(456)]);
}

function Book(id) {
    this.id = ko.observable(id);

    this.IsInBookshelf = ko.computed(function () {
        alert(ViewModels);
        return id%2==0;
    }, this);
}

ko.applyBindings(ViewModels);

.IsInBookshelf {
    background-color: yellow;
}

我无法弄清楚为什么计算方法IsInBookshelf中的var ViewModels是未定义的,因为它应该是一个全局变量。

1 个答案:

答案 0 :(得分:3)

这是因为当ko.computed被执行时(作为new Book的一部分new SearchViewModel的一部分),该值尚未分配给ViewModels,因为它仍然被“处决”。如果您需要在计算的observable中引用ViewModels,则可以创建ViewModels对象,然后单独设置Search属性:

var ViewModels = {};
ViewModels.Search = new SearchViewModel();

new fiddle

请注意,在ViewModel.Search创建时,ViewModels不会有Search属性,但是当ko.computed稍后触发时,它会。{/ p>