淘汰映射viewmodels父子

时间:2015-10-13 03:53:05

标签: javascript jquery asp.net-mvc knockout.js

我是knockout.js的新手,事实上两天前我开始意识到我的UI脚本已经失控了。

所以,我有几个视图模型,都是使用映射功能填充的。

我从通过我的MVC控制器提供的JSON中填充了OK模型。

function ChangeViewModel(data) {
    var self = this;
    changeMapping = {
        'CORs': {
            create: function (options) {
                return new CORViewModel(options.data);
            }
        }
    }
    return ko.mapping.fromJS(data, changeMapping, self);
}

function CORViewModel(data) {
    var self = this;
    corMapping = {
        'copy': ['VendorID', 'VendorName', 'ContractID'],
        'include': ['CorNo', 'CorName', 'Items'],
        'Items': {
            create: function (options) {
                return new CORItemViewModel(options.data);
            }
        }
    }

    self.CorNoName = ko.pureComputed(function () {
        if (self.CorVersion() > 1) return self.CorNo() + ":" + self.CorVersion();
        return self.CorNo();
    });

    self.GrandTotal = ko.pureComputed(function () {
        var total = 0;
        $.each(self.Items(), function () { total += this.Total() })
        return total;
    });

    return ko.mapping.fromJS(data, corMapping, self);
}

function CORItemViewModel(data) {
    var self = this;
    corItemMapping = {
        'copy': ['ChangeItemId', 'VendorCorId', 'VendorName', 'VendorId'],
    }

    return ko.mapping.fromJS(data, corItemMapping, self);
}

这就是我的视图模型,这就是我在$(文档).ready函数中加载vm的方法

var vm = new ChangeViewModel(data);
ko.applyBindings(vm);

我把所有这些显示在一个带有输入等的表格中,并且看起来都很棒。 但是如果我在CORItemViewModel中更改Total,则父CORViewModel中的GrandTotal不会更新。谁能告诉我我可能缺少什么?

1 个答案:

答案 0 :(得分:0)

我创造了一个小提琴,以超级冷却的建议,它工作得很好......

https://jsfiddle.net/afvh6d6t/14/

code..

所以我回到了原来,原来是一个有绑定手柄的问题我用ko-money打破了更新,所以我用了这个bindingHandler ..

http://djsharepoint.com/post/2015/01/28/useful-knockout-js-binding-handlers

对问题进行了排序。

感谢所有花时间发帖的人。