首先,我知道你可以使用Computed observables。它们非常适合复杂的属性,但IMO并不是Silverlight中IValueConverters的有效替代品。 在我目前的项目中,我有多个日期选择器。现在,我必须为每个日期创建一个额外的计算observable,因为我希望格式化工作。所以,如果我有5个日期属于10个属性,那么在Silverlight中你将有5个日期和1个通用日期转换器。
它有效,但代码不是很干净。更不用说在将验证应用到这些日期时遇到的问题..
是否有类似的东西:
<input type="text" data-bind="value: TestProperty" data-converter="MyTextConverter" />
或者有什么替代方案可以让我创建双重属性吗?
提前致谢,
Arne Deruwe
答案 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' } " />