KnockoutJS - 映射和扩展器

时间:2013-05-03 02:49:14

标签: javascript knockout.js knockout-mapping-plugin

我正在尝试使用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”堆栈中。

建议?

提前致谢, 埃连。

1 个答案:

答案 0 :(得分:2)

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

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

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

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