击倒映射视图模型的父-子

knockout mapping viewmodels parent child

本文关键字:模型 映射 视图      更新时间:2023-09-26

我对knockout.js很陌生,事实上两天前当我开始意识到我的UI脚本失控时遇到了这个问题。

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

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

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);
}

这就是我的视图模型,这就是我如何在$(document)中加载vm。准备好函数

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

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

我创建了一个小提琴,感谢超级冷却的建议,它工作得很好…

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

code..

所以我回到原来的,原来是一个问题与bindingHandler我使用ko-money打破了更新,所以我使用这个bindingHandler..

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

对问题进行排序。

感谢所有花时间发帖的人