ASP.net MVC / Knockout JS Mapping - 无法更新ViewModel

时间:2014-11-19 13:35:07

标签: javascript asp.net-mvc-4 knockout.js knockout-mapping-plugin

这看起来非常简单,但我是Knockout JS的新手。在一系列教程之后,我已经提出了这个:

// Create view model
        var viewModel = function () {
            var self = this;
            self.master = ko.mapping.fromJS(@Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(Model)));
            self.total_results = ko.observable(self.master.totalRecordCount());
            self.pager = ko.pager(self.total_results);
            self.pager().CurrentPage.subscribe(function () {
                self.search();
            })
            self.search = function () {
                $.ajax({
                    type: "GET",
                    url: "/api/get?data=1&start_index=" + self.pager().FirstItemIndex() + "&end_index=" + self.pager().LastItemIndex() + "",
                }).done(function (pagedData) {
                    // Map model; create pager
                   ko.mapping.fromJS(pagedData, self.master);
                   //self.total_results(self.master.totalRecordCount());
                }).error(function (ex) {
                    alert("Error");
                });
            }
        }

        $(function () {
            // Apply
            ko.applyBindings(viewModel);
        });

单击分页按钮时,搜索方法将运行并获取新数据。当我更新ViewModel时...没有任何反应。任何想法为什么会这样?

2 个答案:

答案 0 :(得分:2)

您想要更新self.master的内容,而不是覆盖它。因此,请将done回调中的该行更改为:

// Map model; create pager
ko.mapping.fromJS(pagedData, self.master);

答案 1 :(得分:0)

我觉得自己很愚蠢,但这就是整个问题:

var viewModel = function () {
            var self = this;
            self.master = ko.mapping.fromJS(@Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(Model)));
            self.pager = ko.pager(ko.observable(self.master.totalRecordCount()));

            self.pager().CurrentPage.subscribe(function () {
                self.search();
            });

            self.search = function () {
                $.ajax({
                    type: "GET",
                    url: "/api/get?data=1&start_index=" + self.pager().FirstItemIndex() + "&end_index=" + self.pager().LastItemIndex() + "",
                    success: function (obj) {
                        ko.mapping.fromJS(obj, self.master);
                    }
                });
            }
        }

        $(document).ready(function () {
            ko.applyBindings(new viewModel());
        });

由于我在应用绑定时没有抓取“新”viewModel,因此不会发生任何事情。 DRAT!