这是我的代码:
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.ProductListPrice
或self.multiplicationFactor
,则会触发订阅,但是当我们的其余代码和用户输入更改时,订阅不会触发。
任何想法我做错了什么?
答案 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;