1

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

它可以工作,但它不是很干净的代码。更不用说在对这些日期应用验证时遇到的问题了。

有没有类似的东西:

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

或者有什么替代方法不能让我创建双重属性?

提前致谢,

阿恩·德鲁维

4

1 回答 1

4

您正在寻找custom-binding的主要用途。在这里查看一个很好的指南

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 });
  }
};

从这里修改的拦截器代码

编辑:

你的 html 看起来像:

<input type="text"
       data-bind="dateConverter: TestProperty,
                  dateConverterOptions: { format: 'dd/mm/yyyy', anotherOption: 'example' } " />
于 2012-10-01T10:46:33.310 回答