2015-08-17 123 views
0

這是我的代碼:淘汰賽計算不點火訂閱

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,訂閱就會觸發,但是當它們因我的其他代碼和用戶輸入而更改時,訂閱不會觸發。

任何想法我做錯了什麼?

+0

如果你想訂閱計算何時啓計算稍稍柚木它計算。使用'deferEvaluation:true' sample here http://jsfiddle.net/LkqTU/26144/ –

+0

我已經嘗試推遲評估,同時試圖自己跟蹤這個,但它沒有任何區別。謝謝你的想法。 – Tim

回答

2

我唯一的猜測是你在做一個賦值而不是在設置一個值時調用observables。下面的代碼按預期工作。

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>

+0

當你說做一個任務時,你的意思是使用(例如)'self.multiplicationFactor = 3;'而不是'self.multiplicationFactor(3);'?我知道這沒有發生,因爲變量都是可觀察的,但不知道我是否誤解了你的意思。 – Tim

+1

@Tim你理解正確。也可能(儘管不太可能)你正在做'self.multiplicationFactor = ko.observable(3)'這樣的事情,這會讓它成爲一個可觀察的事物,但是卻是一個不同的,不受約束的事物。我只能說這裏包含的代碼沒有問題。 –

+0

這是一個公平的評論,我會檢查我沒有做過這樣愚蠢的事情。 – Tim