使用计算的observable与另一个上下文的实际示例

时间:2014-05-30 14:55:57

标签: javascript knockout.js

我一直在网上搜索一段时间,找到一个使用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.

   });
};

如果您有任何其他想法使用其他技术完成该概念,请列出它。

提前感谢!

1 个答案:

答案 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());

您可以看到 working jsFiddle demonstration here