如何使用webapi绑定knockout

时间:2014-02-15 09:12:26

标签: jquery

有人可以告诉我以下两个RateCardViewModel函数之间的区别

$(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都是异步的。任何帮助将不胜感激。

我需要以第二种方式执行此操作,因为我想使用映射插件

1 个答案:

答案 0 :(得分:0)

两个版本都以异步方式获取数据。不同之处在于第一个版本将检索到的数据立即传递给observable,而另一个版本提供了一个自定义函数,该函数又替换了observable。

但是,不要忘记一个observable实际上是一个函数,这意味着当你设置一个observable的值时,你应该使用self.rateCards(newValue)而不是self.rateCards = newValue。在后一种情况下,您实际上会替换observable,而不是更新它的值,这意味着没有对observable的订阅会知道更改,并且仍然会订阅现在未使用的可观察对象。

要替换顶级版本,您应该执行以下操作:

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

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