我正在尝试通过AJAX加载模型属性的值,但是在AJAX完成时,视图不会更新。
我正在使用knockout 2.0.0和knockout mapping 2.0.3。
的jsfiddle:
HTML:
<p>Code: <span data-bind="text: item.code"></span></p>
<p>Value: <span data-bind="text: item.value"></span></p>
JavaScript的:
var ViewModel = function () {
var self = this;
self.item = ko.mapping.fromJS({ "code": "123" });
self.load = function () {
jQuery.ajax({
"success": function () {
ko.mapping.fromJS({ "value": "abc" }, {}, self.item);
},
"url": "/echo/json"
});
};
self.load();
};
ko.applyBindings(new ViewModel());
在此示例中,显示item.code
的值,因为它是在初始化viewmodel时定义的,但item.value
的值永远不会显示,因为它是异步填充的。
我已经尝试了ko.observable
和ko.mapping.fromJS
的各种排列,无论是属性初始化还是更新,都无济于事。
我想避免 - 如果可能 - 手动初始化所有item
的属性。
我也知道我可以在AJAX调用的ko.applyBindings
内移动success
,但我有多个这样的属性并且这样做我必须实现一个队列系统,太过分了。
我做错了什么?这是正确的方法吗?
答案 0 :(得分:3)
当你进行初始映射时,对于要绑定的UI,没有“值”可观察。因此,当您通过映射插件执行更新时,它将创建“值”可观察,但为时已晚(因为UI已经通过绑定)。
如果您将其初始化为:self.item = ko.mapping.fromJS({ "code": "123", "value": "" });
,那么它将正常运行。