2011-03-09 24 views
1

我正在使用knockoutjs來處理不同的事件 - 其中之一是我想添加千分位器到價格輸入字段。是否訂閱了一個屬性 - 在knockoutjs中 - 它自身會造成問題?

因此,我訂購了一個更改事件到我的價格字段,並做了一些增加缺失分隔符並將其寫回價格字段的魔法。寫回價格領域引發一場新的變革的事件,因此,我需要檢查,以打破循環 - 我問怎麼做,如果該值實際上更改:

this.listingPriceFormatted.subscribe(function (newValue, model) { 
     var cleanValue = newValue.toString().replace(/\D/g, ''); 
     $('#Price').val(cleanValue); 
     var outValue = MySite.Utilities.addThousandSeperator(cleanValue); 
     if (newValue != outValue) { 
      me.listingPriceFormatted(outValue); 
     } 
    }); 

我真的不喜歡觸發同樣的事件兩次,只是爲了設置一次值 - 有什麼辦法可以在不觸發事件的情況下寫回字段,或者我是否做得這一切都錯了?

回答

3

在這種情況下,綁定到writable dependentObservable可能是該工作的正確工具。這將允許您控制字段的讀取和設置方式。例如,如果您有listingPrice observable,那麼您可以有一個listingPriceFormatted可寫的dependentObservable。你會將你的字段綁定到listingPriceFormatted。它看起來像:

viewModel.listingPriceFormatted = ko.dependentObservable({ 
    read: function() { 
       //add commas 
       return MySite.Utilities.addThousandSeperator(this.listingPrice()); 
      }, 
    write: function(newValue) { 
       //strip commas and store in listingPrice 
       this.listingPrice(MySite.Utilities.stripThousandSeperator(newValue)); 
      } 
    }, viewModel); 

爲1.12後添加此功能,所以你需要使用的代碼的副本之後從GitHub。希望這可以幫助。

此外,在這篇文章的最後,是用於封裝可觀察和dependentObservable到一個對象,可能對你有用的想法:http://www.knockmeout.net/2011/03/guard-your-model-accept-or-cancel-edits.html

+0

偉大的答案,excatly什麼,我一直在尋找。淘汰賽是偉大的,但個人我無法瀏覽它的文檔... – 2011-03-10 08:37:48