2014-03-13 135 views
2

我是KnockoutJS的新手,並認爲它是迄今爲止一款出色的工具:)!不過,我有一個關於計算可觀測量的問題,如下所示。在KnockoutJS頁面http://knockoutjs.com/documentation/computedObservables.html處,有一個格式化價格的示例代碼。代碼如下。KnockoutJS強制計算Observable重新計算

HTML 
<p>Enter bid price: <input data-bind="value: formattedPrice"/></p> 

而且JS:

JS 
function MyViewModel() { 
    this.price = ko.observable(25.99); 
  
    this.formattedPrice = ko.computed({ 
        read: function() { 
            return '$' + this.price().toFixed(2); 
        }, 
        write: function (value) { 
            // Strip out unwanted characters, parse as float, then write the raw data back to the underlying "price" observable 
            value = parseFloat(value.replace(/[^\.\d]/g, "")); 
            this.price(isNaN(value) ? 0 : value); // Write to underlying storage 
        }, 
        owner: this 
    }); 
} 
  
ko.applyBindings(new MyViewModel()); 

我也複製代碼,並在這裏放的jsfiddle:http://jsfiddle.net/wDvxw/

我的問題是,該值不更新自己,當你進入同樣的事情兩次。例如:

第1步:輸入25.1234,它變爲$ 25.12 第2步:再次輸入25.1234。現在沒有反應。

我的猜測是該值沒有改變,因此它沒有重新格式化。我可以知道如何解決這個問題嗎?

謝謝!

回答

3

這是Knockout中的一個優化,如果將observable設置爲相同的值,它不會觸發已更改的事件。

所以,如果你想一直火變化事件中,你需要使用valueHasMutated方法manully觸發它:

this.price(isNaN(value) ? 0 : value); // Write to underlying storage 
this.price.valueHasMutated(); 

它本身不會解決你的代碼,因爲沒有引入ko.computed另一個優化在KO 3.0這樣計算,如果計算出的值保持不變,也不會觸發的變化,你需要使用.extend({notify: 'always'})to force the notification of the subscribers.

所以計算出的完整的工作將是這樣的:

this.formattedPrice = ko.computed({ 
   read: function() { 
      return '$' + this.price().toFixed(2); 
   }, 
   write: function (value) { 
   value = parseFloat(value.replace(/[^\.\d]/g, "")); 
     this.price(isNaN(value) ? 0 : value); // Write to underlying storage 
     this.price.valueHasMutated(); 
    }, 
    owner: this 
}).extend({notify: 'always'}); 

演示JSFiddle

+0

非常感謝!我曾看過這個,但沒有意識到這是答案,哈哈。 – Wysie

+0

還有一個問題,當我嘗試以這種方式使用計算的observables時,我發現它通常會導致我的字段在我編輯它時自動更新。因此我需要使用hasFocus,然後使用簡單的檢查。但是,在上面的示例代碼中,我發現在編輯它時,字段本身永遠不會更新。這是爲什麼?我認爲這是業主領域,但似乎並非如此......謝謝! – Wysie

+0

我並不真正關注你的問題。這是如何使焦點來到圖片?你可以創建一個新的小提琴來展示你現在面臨的問題嗎? – nemesv