3

我有一个带有一些可观察对象的 ViewModel 和一个仅在应用绑定后才知道的属性。

例如,我的 UI 包含一个搜索框,它在下方显示匹配项。最初,视图模型内的匹配属性为空,因为没有要附加的数据。但是,一旦搜索框至少包含 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 就无法知道任何新创建的 observables(除了在模板场景中)。

您最初希望创建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 回答