Knockout.js 使用映射实现ViewModel的最佳方法(使用淘汰)

Knockout.js 使用映射实现ViewModel的最佳方法(使用淘汰),knockout.js,Knockout.js,我想将mapping插件与knockout viewmodel一起使用: var TasksListViewModel = (function () { var self = this; var GET_PATH = "/Tasks/Index"; self.loadData = function() { $.getJSON(GET_PATH, function (data) { ko.mapping.fromJS(data, {

我想将mapping插件与knockout viewmodel一起使用:

var TasksListViewModel = (function () {
    var self = this;
    var GET_PATH = "/Tasks/Index";

    self.loadData = function() {
        $.getJSON(GET_PATH, function (data) {
            ko.mapping.fromJS(data, {}, self);
            setSubscribers();
            setComputed();
            ko.applyBindings(self);            
        });
    };

    self.updateData = function() {
        $.getJSON(GET_PATH,
            {
                page: self.Page()                
            }, function (data) {
            ko.mapping.fromJS(data, TasksListViewModel);
        });
    };

    self.setSubscribers = function() {
        self.Page.subscribe(function (newPage) {            
             self.updateData();
        });       
    };

    self.setComputed = function () {
        self.TotalPages = ko.computed(function () {
            return Math.ceil(self.Total() / self.PageSize());
        });        
    }

    return self;
}());

但是我只能在映射之后声明订阅者&计算的可观测值。这条路对吗

我个人喜欢这种方法

ViewModel = function(data) {
    var mapping = {
        myArray: {
            create: function(options) {
                return new ChildViewModel(options.data);
            }
        }
    };

    ko.mapping.fromJS(data, mapping, this);

    this.computed = ko.computed(this.getComputed, this);
};

ViewModel.prototype = {
    getComputed: function() {
        return this.myData() + "computed";
    }
};

ChildViewModel = function(data) {
    ko.mapping.fromJS(data, {}, this);
};


更新时只需调用
ko.mapping.fromJS(data,mapping,this)
再次发现如何避免setComputed函数,只需为每个ko.computed-self添加两个额外参数&{deferEvaluation:true}