2013-07-03 2 views
1

Для одностраничного приложения мне нужно одновременно использовать несколько ViewModels, но не могу получить доступ к другому 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; 
} 

не могу фи вычтите, почему var ViewModels в вычисленном методе IsInBookshelf не определен, поскольку он должен быть глобальной переменной.

ответ

3

Это потому, что в то время, ko.computed данный момент выполняется (как часть new Book в рамках new SearchViewModel), значение еще не присвоен ViewModels, поскольку его до сих пор «выполняется». Если вам необходимо иметь ссылку на ViewModels в вашем вычислен наблюдаемом, вы можете создать ViewModels объект и затем установите Search свойство отдельно:

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

new fiddle

Обратите внимание, что в ViewModel.Search время создания, ViewModels не будет имеют свойство Search, но когда ko.computed будет запущен позднее, он будет.

+2

В противном случае вы можете использовать опцию 'deferEvaluation' для вычисляемого типа:' this.IsInBookShelf = ko.computed ({read: function() {// yourlogic}, deferEvaluation: true}, this); сделайте так, чтобы первая оценка не выполнялась до тех пор, пока кто-то фактически не обратится к ней. –

+0

@ go-oleg: Действительно простая ошибка javascript, которую я сделал там ... Спасибо, что указали это, и простой способ исправить это! Идти! олег. ;) – Heras

+0

@RP Niemeyer: Очень интересный другой подход, который мне нужно изучить. Благодаря! – Heras

Смежные вопросы