我正在尝试使用 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 中的扩展函数会丢失,因此新的更改不会保存在“状态”堆栈中。
建议?
在此先感谢,埃利安。