我正在尝试使用KnockoutJS在我的项目中实现某种撤消功能。为此,我正在使用这个扩展器:
ko.extenders.trackChange = function (target, track) {
if (track) {
target.isDirty = ko.observable(false);
target.originalValue = target();
target.subscribe(function (newValue) {
// Push to "states" array a JS representation of the viewModel
// so I can get a stack of changes
states.push(ko.toJS(track.myViewModel));
target.isDirty(newValue != target.originalValue);
target.originalValue = newValue;
});
}
return target;
};
然后我将扩展器应用到viewModel中的对象:
this.myViewModel = {
label: ko.observable("Label").extend({ trackChange: this });
}
当我想要撤消某个动作时,我会这样做:
ko.applyBindings(ko.mapping.fromJS(states[statesPointer]));
这样可以获得旧值,但是observable中的extend函数会丢失,因此新的更改不会保存在“states”堆栈中。
建议?
提前致谢, 埃连。
答案 0 :(得分:2)
我认为您不应该创建执行撤消操作的新模型实例,而是只更新现有模型的可观察属性:
// you do:
// ko.applyBindings(ko.mapping.fromJS(states[statesPointer]));
// I would do:
ko.mapping.fromJS(states[statesPointer], myViewModel);
看起来您的myViewModel
有自己的上下文,因此您必须修改我的代码才能获得正确的模型参考。