不幸的是,还没有一个很好的 API。但是,您可以在视图中实现自定义格式,同时使用以下代码保持模型属性的原始状态。
can.view.attr('can-somecustom-value', function(el, data) {
var attr = el.getAttribute('can-somecustom-value'),
value = data.scope.computeData(attr, {
args: []
}).compute;
new FormattedValue(el, {
value: value
//value is the only one we really care about, but
//you could specify other arbitrary options here
//such as "format: 'MM/DD/YYYY' to be used in your __format methods below"
});
});
var FormattedValue = can.Control.extend({
init: function () {
this.set();
},
__format: function() {
// return formatted version of this.options.value;
},
__deformat: function() {
// return this.element[0].value sans format(keeps your model pristine);
},
'{value} change': 'set',
set: function () {
if (!this.element) {
return;
}
var self = this;
setTimeout(function() {
self.element[0].value = self.__format();
});
},
'change': function () {
if (!this.element) {
return;
}
this.options.value(this.__deformat());
}
});
这将允许您执行以下操作:
<input can-somecustome-value="myDateProp"/>
其中“myDateProp”是某些 can.Map/can.Model/etc 上的属性。
这将导致输入显示自定义字符串格式,而 someModel.attr('myDateProp') 仍将返回 ISO 格式(这反过来意味着 ISO 格式也将保存到服务器)。
有一些关于添加过滤器/解析器以允许控制仅用于查看渲染的格式的内部讨论。