3

いくつかのオブザーバブルと、バインディングが適用された後にのみ認識されるプロパティを持つViewModelがあります。

たとえば、私のUIは、下に一致するものを表示する検索ボックスで構成されています。最初は、アタッチするデータがないため、ビューモデル内の一致のプロパティはnullです。ただし、検索ボックスが3文字以上になると、AJAX呼び出しが行われ、データがフェッチされます。

マッピングプラグインを呼び出すと、呼び出しからのデータをKOにマッピングするために、KOが監視可能な配列を遅延バインドできないかのようになります。問題は、そもそもバインディングを設定するためにマップに与えるものが何もないことです。

私のコード:

  var vm = new function () {
        var self = this;

        self.customers = null;
        self.searchText = ko.observable("");

        self.searchText.subscribe(function (data) {
            if (data.length > 2) {
                // do search
                $.get("/customers/getall", { searchTerms: self.searchText }, function (resp) {

                    if (!self.customers) {
                        // first mapping
                        self.customers= ko.mapping.fromJS(resp.customers);
                    } else {
                        ko.mapping.fromJS(self.customers, resp.customers);
                    }
                });
            } 
        });

    }

    ko.applyBindings(vm, $("#searchCustomersScope")[0]);
4

1 に答える 1

2

バインディングが実行されると、KO は、作成された新しいオブザーバブルを知ることができません (テンプレート シナリオを除く)。

self.customers最初に空の監視可能な配列として作成したい場合は、マッピング プラグインがそれを更新できるようにすることができます。

やり方はいくつかありますが、例えばこんな感じです。

    self.customers = ko.observableArray();
    self.searchText = ko.observable("");

    self.searchText.subscribe(function (data) {
        if (data.length > 2) {
            // do search
            $.get("/customers/getall", { searchTerms: self.searchText }, function (resp) {
                    ko.mapping.fromJS(resp.customers, {}, self.customers);
            });
        } 
    });
于 2012-07-25T13:22:50.510 に答える