对于单页面应用程序,我需要同时使用多个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是未定义的,因为它应该是一个全局变量。
答案 0 :(得分:3)
这是因为当ko.computed
被执行时(作为new Book
的一部分new SearchViewModel
的一部分),该值尚未分配给ViewModels
,因为它仍然被“处决”。如果您需要在计算的observable中引用ViewModels
,则可以创建ViewModels
对象,然后单独设置Search
属性:
var ViewModels = {};
ViewModels.Search = new SearchViewModel();
请注意,在ViewModel.Search
创建时,ViewModels
不会有Search
属性,但是当ko.computed
稍后触发时,它会。{/ p>