在Knockout js中有替代IValueConverter的方法吗?

时间:2012-10-01 09:59:20

标签: knockout.js

首先,我知道你可以使用Computed observables。它们非常适合复杂的属性,但IMO并不是Silverlight中IValueConverters的有效替代品。 在我目前的项目中,我有多个日期选择器。现在,我必须为每个日期创建一个额外的计算observable,因为我希望格式化工作。所以,如果我有5个日期属于10个属性,那么在Silverlight中你将有5个日期和1个通用日期转换器。

它有效,但代码不是很干净。更不用说在将验证应用到这些日期时遇到的问题..

是否有类似的东西:

<input type="text" data-bind="value: TestProperty" data-converter="MyTextConverter" />

或者有什么替代方案可以让我创建双重属性吗?

提前致谢,

Arne Deruwe

1 个答案:

答案 0 :(得分:4)

您正在寻找custom-binding的主要用途。请参阅此处查看good guide

ko.bindingHandlers.dateConverter = {
  init: function (element, valueAccessor, allBindingsAccessor) {
    var underlyingObservable = valueAccessor();
    var options = allBindingsAccessor().dateConverterOptions
                    || { /* set defaults here */ };

    var interceptor = ko.computed({
      read: function() {
        return underlyingObservable();
      },

      write: function(newValue) {
        var current = underlyingObservable(),
            convertedDate;

        /* do some kind of conversion here, using the 'options' object passed */

        if (convertedDate !== current) {
          underlyingObservable(convertedDate);
        }
        else if (newValue !== current.toString()) {
          underlyingObservable.valueHasMutated();
        }
      }
    });

      ko.applyBindingsToNode(element, { value: interceptor });
  }
};

here

修改的拦截器代码

修改

你的HTML看起来像:

<input type="text"
       data-bind="dateConverter: TestProperty,
                  dateConverterOptions: { format: 'dd/mm/yyyy', anotherOption: 'example' } " />