我使用knockout.mapping
插件就像这样不必获取moment对象而不是蹩脚的日期:
var mappedPeople = ko.mapping.fromJS(people, {
Birthdate: {
create: function(op) {
return ko.observable( moment( new Date(op.data) ) );
}
}
});
冷却。
现在,在进行修改之后,我想将整个数组返回到常规js。听起来像是ko.mapping.toJS
的工作!
但我怎么回到约会? toJS
似乎采用了一个选项对象,但我似乎无法找到一个有助于此的选项。
更新:我知道在使用moment.js的特定场景中,有很多方法可以通过强制转换为字符串和重新换行来解决这个问题,基本问题是关于如何为插件提供自定义的“取消映射”功能。
更新2 :以下是jsbin演示此问题:http://jsbin.com/uzesag/1/
答案 0 :(得分:2)
我知道这并不严格地回答如何自定义取消映射本身的问题,但我发现处理这种情况的一种有用方法是将原始数据包装在observables中,但添加计算的observables(sub-observables) )给观察者自己。最好用一个例子说明......
JSBin showing moment added as sub-observable on Birthdate
关键代码段在这里......
var mappedPeople = ko.mapping.fromJS(people, {
Birthdate: {
create: function(op) {
var observable = ko.observable(op.data);
// Attach computed to 'Birthdate' that produces moment
observable.moment = ko.computed({
read: function() {
return moment( new Date(observable()) );
},
write: function(val) {
observable(val.toDate().toISOString());
}
});
return observable;
}
}
});
这意味着当您调用ko.mapping.toJS或ko.mapping.toJSON时,将保留原始结构。诀窍是你实际上需要将时刻存储回计算中(使其与包含在observable中的原始数据同步)...
function VM() {
this.mapped = mappedPeople;
// read moment computed
var moment = this.mapped()[0].Birthdate.moment();
// manipulate
moment.add(5, 'y');
// set it back
this.mapped()[0].Birthdate.moment(moment);
// unmapping
this.unmapped = ko.mapping.toJSON(this.mapped);
}
ko.applyBindings(new VM());