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、非同期で入力されるため、 の値は表示されません。

プロパティの初期化と更新の両方で、ko.observableとのさまざまな順列を既に試しましたが、役に立ちませんでした。ko.mapping.fromJS

item可能であれば、すべての のプロパティを手動で初期化することは避けたいと思います。

ko.applyBindingsAJAX 呼び出しの内部に移動できることも知ってsuccessいますが、このようなプロパティが複数あり、そのためにはキュー システムを実装する必要があり、これはやり過ぎです。

私は何を間違っていますか?それを行う正しい方法は何ですか?

4

1 に答える 1

3

最初のマッピングを行うとき、UI がバインドする "値" オブザーバブルはありません。そのため、マッピング プラグインを介して更新を行うと、「値」オブザーバブルが作成されますが、手遅れです (UI は既にバインドされているため)。

次のように初期化すると、self.item = ko.mapping.fromJS({ "code": "123", "value": "" });正しく動作します。

于 2012-02-13T17:39:10.507 に答える