有人可以告诉我以下两个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都是异步的。任何帮助将不胜感激。
我需要以第二种方式执行此操作,因为我想使用映射插件
答案 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);
});
}