有没有办法让映射异步填充模型的属性并自动更新视图?

时间:2012-02-13 16:50:21

标签: knockout.js knockout-mapping-plugin

我正在尝试通过AJAX加载模型属性的值,但是在AJAX完成时,视图不会更新。

我正在使用knockout 2.0.0和knockout mapping 2.0.3。

的jsfiddle:

http://jsfiddle.net/rsfTy/

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.observableko.mapping.fromJS的各种排列,无论是属性初始化还是更新,都无济于事。

我想避免 - 如果可能 - 手动初始化所​​有item的属性。

我也知道我可以在AJAX调用的ko.applyBindings内移动success,但我有多个这样的属性并且这样做我必须实现一个队列系统,太过分了。

我做错了什么?这是正确的方法吗?

1 个答案:

答案 0 :(得分:3)

当你进行初始映射时,对于要绑定的UI,没有“值”可观察。因此,当您通过映射插件执行更新时,它将创建“值”可观察,但为时已晚(因为UI已经通过绑定)。

如果您将其初始化为:self.item = ko.mapping.fromJS({ "code": "123", "value": "" });,那么它将正常运行。