2012-01-12 15 views
5

Desidero implementare la funzionalità Annulla e Ripeti non solo per il lato client ma anche per il lato server. Per insatnce ho un div contenente l'immagine e posso ruotare il ridimensionamento e riscriverlo, Tutte le operazioni di base per la generazione di immagini. E tutte le operazioni aggiornano database e immagini. puoi dire che la mia immagine viene rigenerata e il database viene aggiornato dopo ogni azione.Implementazione delle funzionalità di annullamento e ripetizione javascript e php

Ora ho bisogno di implementare funzionalità Annulla e Ripristina. Ho fatto anche delle ricerche. Quello di cui ho bisogno è l'approccio migliore su come implementare l'attività richiesta. Stavo pensando di mantenere ogni azione "tipo di registro" o gestirla con un database o con matrici javascript incluso HTML o cos'altro ??

qual è l'approccio migliore per raggiungere il mio obiettivo.

Grazie,

+0

potete inserire quello che hai fino ad ora? –

+0

Esiste un noto [Command design pattern] (http://sourcemaking.com/design_patterns/command) che è molto adatto per la funzionalità di annullamento del ripristino. –

risposta

18

A un livello base, è bisogno di due cose:

  • uno stack operazione (Array) che tiene traccia delle operazioni che sono state eseguite. Quando l'utente esegue un'operazione, si crea un oggetto che descrive l'operazione e lo si aggiunge all'array. Quando l'utente esegue l'annullamento, è possibile rimuovere l'ultimo elemento dall'array.

  • ogni tipo di operazione richiede un metodo "salva" e un metodo "annulla". Questo può diventare complicato in quanto alcuni metodi di 'annullamento' sono simili al loro metodo 'salva' (cioè per annullare un capovolgimento orizzontale si esegue semplicemente un altro capovolgimento), mentre altri non hanno tale simmetria (cioè per annullare un raccolto che si dovrebbe memorizzare i dati dell'immagine come prima che si verificasse il ritaglio).

Se si desidera ripristinare la funzionalità, è necessario un secondo stack di operazioni. Ogni volta che un'operazione è stata annullata, la aggiungeresti alla fine della pila di ripetizioni. Se l'utente fa clic su "Ripristina", lo si sposta nuovamente nella pila delle operazioni.

Può essere utile esaminare il modello di comando (http://en.wikipedia.org/wiki/Command_pattern), poiché spesso viene utilizzato per implementare Annulla.

+1

Undo/Redo può anche essere implementato con un singolo array di comandi eseguiti e utilizzare un indice/puntatore all'ultima operazione attiva che può spostarsi verso l'alto o verso il basso nello stack ... ma in generale funziona in modo eterogeneo, basta salvare su doppia memoria – Sherlock