我正在尝试使用ko.mapping将数据转换为viewmodel。结果来自对Web服务的异步调用。
简单视图:
<div data-bind="with: myData">
<div data-bind="text: mapWidth"></div>
<div data-bind="text: mapHeight"></div>
<div data-bind="foreach: priceRanges">
<div data-bind="text: title"></div>
</div>
AND视图模型如下:
var ViewModel = function() {
var self = this;
self.myData = null;
var data = {
action: 'GetPricePoints',
type: 'who cares'
};
$.ajax({
url: 'http://cdt.lotamore.com/api/imap',
data: { "": JSON.stringify(data) },
//async: false, // works!
async: true, // doesn't work!!!!!
type: 'post'
})
.done(function (data) {
self.myData = ko.mapping.fromJS(data);
})
.error(function (data) {
alertError(data);
})
.always(function () {
});
};
当我同步运行时,工作正常。但是,当我以异步方式运行它时,它不会更新视图模型中的myData
。
我在这里创造了一个小提琴: http://jsfiddle.net/jgergen/jF9pm/20/
我真的不想做阻止UI线程的ajax调用! 我在这里做错了什么?
谢谢, 吉姆
答案 0 :(得分:1)
以下是解决方案:
我改变了这句话:
self.myData = null;
为:
self.myData = ko.observable();
这不是全部,我之前尝试过这一点而没有取得好成绩。除了使myData
可观察之外,我还必须改变它的更新方式。这是新的.done
方法:
.done(function (d) {
self.myData(ko.mapping.fromJS(d));
})
所以,我需要做的是像对待任何其他观察一样对待这个领域。
你可以在这个新的小提琴上看到它:http://jsfiddle.net/jgergen/jF9pm/47/
我希望这比我更有帮助。我在网上搜索了这个问题的解决方案而没有任何结果。所以就是这样。
谢谢, 吉姆