1

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

建议?

在此先感谢,埃利安。

4

1 回答 1

2

我认为您不应该创建执行撤消操作的新模型实例,而只需更新现有模型的可观察属性:

// you do:
// ko.applyBindings(ko.mapping.fromJS(states[statesPointer]));

// I would do:
ko.mapping.fromJS(states[statesPointer], myViewModel);

看起来您myViewModel有自己的上下文,因此您必须修改我的代码才能获得对模型的正确引用。

于 2013-05-03T07:04:42.800 回答