Операции отмены / возврата - это только сохранение в массиве выполненного вами действия и индекса действия, в котором вы находитесь.Каждое изменение, вы удаляете элементы в массиве после состояния.Puff Я полагаю, что это лучше на примере
Представьте, что у вас есть три кнопки и еще две для отмены / повтора
<button (click)="add(0)">add 0</button>
<button (click)="add(1)">add 1</button>
<button (click)="add(2)">add 2</button>
<p>{{values|json}}</p>
<button (click)="undo(2)">undo</button>
<button (click)="redo(2)">redo</button>
В вашем компоненте вам нужны две переменные "historyIndex" и "history"
values: number[] = [];
history: any[] = [];
historyIndex: number = -1;
И наши функции «добавить», «повторить» и «отменить»
add(value) {
//remove all next history
if (this.history.length>this.historyIndex+1)
this.history.splice(-this.historyIndex - 1);
//Store the necesary properties to undo/redo
this.history.push({ index: this.values.length, value: value });
this.historyIndex = this.history.length - 1; //store the index;
this.values.push(value);
}
undo() {
//we need remove the element in "this.history[historyIndex]"
this.values.splice(this.history[this.historyIndex].index, 1);
this.historyIndex--;
}
redo() {
if (this.history.length > this.historyIndex+1) {
this.historyIndex++;
this.values.splice(this.history[this.historyIndex].index, 0,
this.history[this.historyIndex].value);
}
}
См. stackblitz