1

我正在使用 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);
        }
    });

我真的不喜欢两次触发相同的事件来设置一次值 - 有什么方法可以写回字段而不再次触发事件,还是我做错了?

4

1 回答 1

3

在这种情况下,绑定到可写的dependentObservable可能是完成这项工作的正确工具。这将允许您控制如何读取和设置字段。

例如,如果您有一个 ListingPrice 可观察对象,那么您可以有一个 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 的代码的更高版本。希望这可以帮助。

此外,在这篇文章的最后,是将 observable 和dependentObservable 封装到一个可能对您有用的对象中的想法:http ://www.knockmeout.net/2011/03/guard-your-model-accept-或-取消-edits.html

于 2011-03-09T15:12:39.557 回答