Knockout计算出没有解雇订阅

时间:2015-08-17 10:03:57

标签: knockout.js

这是我的代码:

self.convertedPrice = ko.computed(function () {
    console.debug('Calculating convertedPrice');
    if (self.ProductListPrice() != null && self.multiplicationFactor() != null) {
        return self.ProductListPrice() * self.multiplicationFactor();
    }

    return 0;
}).extend({notify:'always'});

self.convertedPrice.subscribe(function (newVal) {
    console.debug('convertedPrice subscription fired.');
    self.discountedPrice(parseFloat(newVal).toFixed(2));
});

更新self.ProductListPrice时,self.convertedPrice会正确更新并编写第一个调试,但不会触发订阅,因此永远不会写入第二个调试语句,并且self.discountedPrice不会更新

我现在通过将订阅的内容移动到计算代码中来解决这个问题,但我想了解为什么原始订阅不起作用。如果我手动更改self.ProductListPriceself.multiplicationFactor,则会触发订阅,但是当我们的其余代码和用户输入更改时,订阅不会触发。

任何想法我做错了什么?

1 个答案:

答案 0 :(得分:2)

我唯一的猜测是你在做一个作业而不是在设置一个值时调用observable。下面的代码按预期工作。



function viewModel() {
  var self = {
    discountedPrice: ko.observable(),
    ProductListPrice: ko.observable(),
    multiplicationFactor: ko.observable()
  };
  self.convertedPrice = ko.computed(function() {
    console.debug('Calculating convertedPrice');
    if (self.ProductListPrice() != null && self.multiplicationFactor() != null) {
      return self.ProductListPrice() * self.multiplicationFactor();
    }

    return 0;
  }).extend({
    notify: 'always'
  });

  self.convertedPrice.subscribe(function(newVal) {
    console.debug('convertedPrice subscription fired.');
    self.discountedPrice(parseFloat(newVal).toFixed(2));
  });
  return self;
}

ko.applyBindings(viewModel());

<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<div><label>List Price</label><input data-bind="value:ProductListPrice" /></div>
<div><label>Multiplier</label><input data-bind="value:multiplicationFactor" /></div>
<div><label>Converted</label> <span data-bind="text:convertedPrice"></span></div>
<div><label>Discounted</label> <span data-bind="text:discountedPrice"></span></div>
&#13;
&#13;
&#13;