2014-02-15 3 views
0

Может кто-нибудь сказать мне разницу между следующими двумя функциями RateCardViewModelКак я связать нокаут с WebAPI

$(document).ready(function() { 
    ko.applyBindings(new RateCardsViewModel(1)); 
}); 

function RateCardsViewModel(projectId) { //This version binds as expected 
    var self = this; 
    self.rateCards = ko.observableArray(); 
    $.getJSON("/api/mydata/1", self.rateCards); 
} 

function RateCardsViewModel(projectId) { //This version does not bind 
    var self = this; 
    self.rateCards = ko.observableArray(); 

    $.getJSON("/api/mydata/1", function (data) { 
     self.rateCards = data; 
    }); 

}

Похоже, что вторая версия получает свои данные после привязки, но я подумали, что обе версии getJSON были асинхронными. Любая помощь будет оценена по достоинству.

мне нужно сделать, это второй путь, потому что я хочу использовать отображение Plugin

ответ

0

Оба версии получают данные асинхронно. Разница в том, что первая версия передает данные, полученные непосредственно на наблюдаемые, в то время как другая обеспечивает пользовательскую функцию, которая, в свою очередь, заменяет наблюдаемую.

Не забывайте, однако, что наблюдаемая на самом деле функция, а это означает, что когда вы устанавливаете значение наблюдаемого, вы должны использовать self.rateCards(newValue) не self.rateCards = newValue. В последнем случае вы фактически замените наблюдаемое, а не обновляете его значение, а это означает, что никакие подписки на наблюдаемые не будут знать об изменениях и будут по-прежнему подписаны на теперь неиспользованный наблюдаемый объект.

Чтобы заменить верхнюю версию, вы должны поэтому сделать что-то вроде:

function RateCardsViewModel(projectId) { 
    var self = this; 
    self.rateCards = ko.observableArray(); 

    $.getJSON("/api/mydata/1", function (data) { 
     self.rateCards(data); 
    }); 
} 
+0

Спасибо Роберту, что имеет смысл. – silverstirling

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