可能有一种方法可以在映射设置中进行设置,但我还不能完全弄清楚。
同时,您可以取消映射对象并将其映射回来,因此您实际上是在制作副本。
var newJob = ko.mapping.fromJS(ko.mapping.toJS(job));
这将是最简单的方法,就像任何其他库一样,再次“反序列化”和“序列化”。
我一直在寻找一种使用映射选项的好方法,并找到了一种方法。
默认情况下,映射插件将从源对象中获取可观察实例,并在目标对象中使用相同的实例。所以实际上,两个实例将共享相同的 observables(错误?)。我们需要做的是为每个属性创建一个新的 observable 并将值复制过来。
幸运的是,有一个方便的实用函数来映射对象的每个属性。然后我们可以创建新的可观察实例,并使用这些值的副本进行初始化。
// Deep copy
var options = {
create: function (options) {
// map each of the properties
return ko.mapping.visitModel(options.data, function (value) {
// create new instances of observables initialized to the same value
if (ko.isObservable(value)) { // may want to handle more cases
return ko.observable(value);
}
return value;
});
}
};
var newJob = ko.mapping.fromJS(job, options);
请注意,这将是一个浅拷贝,如果您想要一个深拷贝,您可能必须递归地映射对象。但是,这将解决您示例中的问题。