Jquery 如何将knockout与webapi绑定
有人能告诉我以下两个RateCardViewModel函数之间的区别吗Jquery 如何将knockout与webapi绑定,jquery,Jquery,有人能告诉我以下两个RateCardViewModel函数之间的区别吗 $(document).ready(function () { ko.applyBindings(new RateCardsViewModel(1)); }); function RateCardsViewModel(projectId) { //This version binds as expected var self = this; self.rateCards = ko.observ
$(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都是异步的。任何帮助都将不胜感激
我需要用第二种方法来实现这一点,因为我想使用映射插件,这两个版本都是异步获取数据的。不同之处在于,第一个版本将检索到的数据立即传递给可观察对象,而另一个版本提供了一个自定义函数,该函数反过来替换可观察对象 但是,不要忘记可观察对象实际上是一个函数,这意味着在设置可观察对象的值时,应使用
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);
});
}
谢谢,罗伯特,这很有道理。