1

对于单页应用程序,我需要同时使用多个 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 未定义,因为它应该是一个全局变量。

4

1 回答 1

3

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

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

新小提琴

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

于 2013-07-03T15:23:19.773 回答