Я пытаюсь реализовать какую-то функцию отмены в своем проекте с помощью 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;
};
Затем я применяю расширитель к объекту в модели представления:
this.myViewModel = {
label: ko.observable("Label").extend({ trackChange: this });
}
И когда я хочу отменить действие, я делаю это:
ko.applyBindings(ko.mapping.fromJS(states[statesPointer]));
Это нормально для получения старых значений, но функция расширения в наблюдаемом объекте теряется, поэтому новые изменения не сохраняются в стеке «состояний».
Предложения?
Заранее спасибо, Элиан.