我知道这并不是严格来说回答如何自定义取消映射本身的问题,但我发现处理这种情况的一种有用方法是将原始数据包装在可观察对象中,但将计算的可观察对象(子可观察对象)添加到可观察者本身。最好用一个例子来说明......
JSBin 显示在 Birthdate 添加为 sub-observable 的时刻
关键片段在这里...
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());