在两个 ViewModels Knockoutjs 之间共享一个 ko.computed
Shared a ko.computed between two 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;
});
我想在两个 ViewModel 之间共享这个。我有 StartViewModel
和 UploadViewModel
,我使用 ko.mapping
动态创建可观察对象,这两个 ViewModel 使用完全相同的 grandTotal
计算可观察对象,尽管它们在其他方面有所不同。
有什么好的方法吗,我看了ko.extenders,但这不是我要找的。
这似乎是使用继承的一个很好的候选者,像这样:
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"));
Fiddle 这里:
http://jsfiddle.net/luisvsilva/freLc1nd/3/
通常当我在 Javascript 中使用继承时,我会使用 John Resig 的精彩片段:
你可以使用一个普通的函数。所以:
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)"
为此,我更倾向于组合而不是继承,因为您说过它们是两种截然不同的视图/模型。因此,如果这里没有 "is a" 关系,我会选择 "has a" 即组合。
所以我有以下 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 之间共享这个。我有 StartViewModel
和 UploadViewModel
,我使用 ko.mapping
动态创建可观察对象,这两个 ViewModel 使用完全相同的 grandTotal
计算可观察对象,尽管它们在其他方面有所不同。
有什么好的方法吗,我看了ko.extenders,但这不是我要找的。
这似乎是使用继承的一个很好的候选者,像这样:
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"));
Fiddle 这里:
http://jsfiddle.net/luisvsilva/freLc1nd/3/
通常当我在 Javascript 中使用继承时,我会使用 John Resig 的精彩片段:
你可以使用一个普通的函数。所以:
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)"
为此,我更倾向于组合而不是继承,因为您说过它们是两种截然不同的视图/模型。因此,如果这里没有 "is a" 关系,我会选择 "has a" 即组合。