我一直在网上搜索一段时间,找到一个使用knockout js computed observable feature的例子,将owner
属性设置为另一个上下文而不是根上下文。
问题是我正在尝试访问根计算属性的foreach当前上下文,以便在主vm上的一个属性的帮助下计算product.finalPrice
属性,如下所示:
var product = function(){
this.finalPrice = ko.observable(0); // setting its value on the main vm.
};
var mainVM = function(){
this.taxRate = ko.observable(0.18); // tax property that is involoved on product price.
this.CalculateFinalPrice = ko.computed({
read:function(){....}, // reading value from current product context.
write:function(value){....},
owner: // I want to set the current foreach binding context here in order to change current product final price here.
});
};
如果您有任何其他想法使用其他技术完成该概念,请列出它。
提前感谢!
答案 0 :(得分:1)
我认为你不必担心主人是谁。我也认为你不应该试图修改产品的价格,因为你不知道你是否已经完成了。每次访问计算属性时,都会反复应用税率。
如果product
中有mainVM
个可观察数组,那么它可以保持原样。但是,如果每个产品都知道mainVM
的税率,则可以计算其自己的最终价格。在此示例中,我使用中介链接从mainVM
到每个product
的税率。然后,您可以随时访问任何产品的免税价格或纳税价格:
var taxMediator = new ko.subscribable();
var product = function(initialPrice) {
var self = this;
self.taxRate = ko.observable(0);
taxMediator.subscribe(function(newValue) {
self.taxRate(newValue);
}, self, "updated");
self.price = ko.observable(initialPrice);
self.finalPrice = ko.computed(function() {
return (+self.price() * (1 + +self.taxRate())).toFixed(2);
});
};
var mainVM = function(){
var self = this;
self.taxRate = ko.observable(0);
self.taxRate.subscribe(function(newValue) {
taxMediator.notifySubscribers(newValue, "updated");
});
self.products = ko.observableArray((function() {
return [
new product(100),
new product(300),
new product(50)
];
})());
};
ko.applyBindings(new mainVM());