2015-05-19 162 views
1

所以我有以下ko.computed:共享兩個的ViewModels Knockoutjs之間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; 
    }); 

我想兩個的ViewModels之間分享。我有StartViewModelUploadViewModel,我用ko.mapping來動態創建observables,這兩個ViewModel使用完全相同的grandTotal,儘管它們在其他方面有所不同。

有沒有一個很好的方法來做到這一點,我看着ko.extenders,但這不完全是我正在尋找。

+0

因爲我有兩個意見。 –

+0

對不起有點smartass,視圖差別很大,因此ViewModels的計算值和ko.validations也有很大的不同,它很高興有兩個Javascript文件組織這個代碼並保持它的獨立和整齊 –

回答

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/

+0

你有沒有運行你的小提琴?它不適合我。 – rism

+0

是的,使用Javascript很多,但創建一個BaseClass,我每天在C#中做的事情在Javascript中沒有用過,我從來沒有在Javascript中使用繼承 –

+1

是「Vm2.prototype.constructor = Vm1;」應該是「Vm2.prototype.constructor = Vm2;」 ? –

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)" 

我贊成組成了因爲你已經說過他們是兩個截然不同的觀點/模型。所以如果在這裏沒有「是」的關係,我會去「擁有」即構圖。

+0

嗯,我只是將其他答案標記爲正確的,這裏唯一的想法是,這不會是一個ko.computed觀察。如果self.TornEdgeCost()改變了ko.computed,grandTotal會自動更新,但這個解決方案不會。但我看到你關於繼承構成的觀點 –

+1

@BrianOgden不,它確實更新。如果'self.TornEdgeCost()'改變了,包括'grandTotal'在內的用戶界面會相應更新。綁定運行'$ root',你也可以在不同的場景中使用'$ data'。無論哪種方式,它的運行方式與'ko.computed()'相同......當模型值發生變化時,整個事件都會更新......否則,該怎麼說纔是正確的?;-) – rism

+0

我之前沒有使用過$ root,或者它記得太久了,感謝您的幫助......所以$ root是「父」敲除對象? –