1

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

我正在使用淘汰赛 2.0.0 和淘汰赛映射 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显示 的值是因为它是在初始化视图模型时定义的,但item.value从未显示 的值,因为它是异步填充的。

我已经尝试了 and 的各种排列ko.observableko.mapping.fromJS用于属性初始化和更新,但无济于事。

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

我也知道我可以在 AJAX 调用中移动ko.applyBindingssuccess但我有不止一个这样的属性,要做到这一点,我必须实现一个队列系统,这是一种矫枉过正的做法。

我究竟做错了什么?正确的做法是什么?

4

1 回答 1

3

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

如果你像这样初始化它:self.item = ko.mapping.fromJS({ "code": "123", "value": "" });那么它将正常工作。

于 2012-02-13T17:39:10.507 回答