在两个ViewModel Knockoutjs之间共享一个ko.computed

时间:2015-05-19 00:31:07

标签: c# asp.net-mvc mvvm knockout.js

所以我有以下ko.computed:

  self.grandTotal = ko.computed(function () {
        var total = self.bookBasePrice();

        if (self.TornEdge() == true)
            total += self.TornEdgeCost();

        if (self.LogoStamping() == true)
            total += self.LogoCost();

        return total;
    });

我想在两个ViewModel之间分享这个。我有StartViewModelUploadViewModel并且我使用ko.mapping来动态创建observable,这两个ViewModel使用完全相同的grandTotal计算的observable,尽管它们在其他方面有所不同。

有没有一个好方法可以做到这一点,我看了ko.extenders,但这不完全是我想要的。

2 个答案:

答案 0 :(得分:1)

这似乎是使用继承的一个很好的候选者,如下所示:

function BaseVM(){
    var self = this;
    self.someValue = ko.observable();
    self.grandTotal = ko.computed(function () {
       return self.someValue()+1; 
    });
}

function Vm1(initValue){
    var self = this;
    self.someValue(initValue);
}

Vm1.prototype = new BaseVM();
Vm1.prototype.constructor=Vm1;



function Vm2(){
    var self = this;
    self.someValue(13); 
}

Vm2.prototype = new BaseVM();
Vm2.prototype.constructor=Vm2;


ko.applyBindings(new Vm1(4),document.getElementById("View1"));
ko.applyBindings(new Vm2(),document.getElementById("View2"));

小提琴:

http://jsfiddle.net/luisvsilva/freLc1nd/3/

通常当我在Javascript中使用继承时,我使用这个伟大的片段形式,真棒John Resig:

http://ejohn.org/blog/simple-javascript-inheritance/

答案 1 :(得分:1)

您可以使用普通功能。所以:

self.grandTotal = myGrandTotaller;

然后定义该功能:

function myGrandTotaller(self) {
        var total = self.bookBasePrice();

        if (self.TornEdge() == true)
            total += self.TornEdgeCost();

        if (self.LogoStamping() == true)
            total += self.LogoCost();

        return total;
    }

然后你的绑定语法就像是一个文本框:

data-bind="value:grandTotal($root)"

我赞成合成而不是继承,因为你已经说过他们是两个非常不同的观点/模型。因此,如果没有"是"这里的关系,我会去"有一个"即组成。