2011-06-17 2 views
15

Je crée une application Web de modification de carte dans laquelle nous pouvons créer et modifier des polylignes, des polygones, etc. J'ai du mal à trouver des informations sur l'annulation d'implémentation sur le Web. "et" voici mon modèle de commande utilisant des fermetures "mais je pense qu'entre cela et une interface entièrement défaire/refaire, il y a pas mal de chemin.Implémentation de l'annulation dans une application Web

Alors, voici mes questions (bon candidat pour wiki je pense):

  • Si je gérer la pile, ou est-il un moyen d'envoyer mes commandes à la pile du navigateur? Comment puis-je gérer "compression de commande" (groupement de commandes) lorsque certaines commandes sont natives navigateur
  • Comment puis-je détecter l'annulation (ctrl + z) frappe?
  • Si j'inscris un événement de clé, comment puis-je décider si j'empêche le défaut ou non?
  • Sinon, puis-je enregistrer un gestionnaire undoevent quelque part?
  • Les utilisateurs ne sont pas habitués à défaire sur le web, comment puis-je les "former" pour explorer/annuler sur mon application?

Merci à tous.

+0

Défaire quoi? Les champs d'entrée dans le navigateur ont été annulés en utilisant ctrl-z. De quoi avez-vous besoin pour annuler? A soumettre? – mplungjan

+0

mon contexte est la création de carte mais j'aimerais ouvrir un peu le sujet. – nraynaud

Répondre

1

La façon dont le support d'annulation automatique de Cappuccino fonctionne consiste à indiquer au gestionnaire d'annulation quelles propriétés doivent être annulables. Par exemple, faire semblant que vous gérez les dossiers des étudiants, vous pourriez faire quelque chose comme:

[theUndoManager observeChangesForKeyPath:@"firstName" ofObject:theStudent]; 
[theUndoManager observeChangesForKeyPath:@"lastName" ofObject:theStudent]; 

Maintenant, quelle que soit la façon dont le nom des élèves est changé dans l'interface utilisateur, frapper undo revient automatiquement en arrière. Cappuccino gère également automatiquement les changements coalescents dans la même boucle d'exécution, marquant le document comme "sale" (nécessitant d'être sauvegardé) quand il y a des éléments sur la pile d'annulation, etc etc (en d'autres termes, tout ce que vous devez faire pour supporter annuler).

Autre exemple, si vous vouliez faire des ajouts et des suppressions d'étudiants annulable, vous souhaitez effectuer les opérations suivantes:

[theUndoManager observeChangesForKeyPath:@"students" ofObject:theClass]; 

Depuis les « étudiants » est un tableau d'étudiants en theClass, puis ajouts et les suppressions à partir de ce tableau sera suivi.

+0

merci c'est intéressant, mais comment intégrez-vous avec l'annuler/refaire natif dans le navigateur? – nraynaud

+0

Cappuccino gère juste cela - il le lie automatiquement dans cmd-z sur mac, et les raccourcis clavier appropriés sur les fenêtres, etc etc Il devrait tout "juste fonctionner". –

+0

Mon but n'est pas d'utiliser aveuglément le cappuccino, je crée un système ando pour une application qui n'utilise pas de cappuccino. J'aimerais comprendre comment tu l'as fait avant. Mais le code cadre est vraiment difficile à lire et à suivre pour les profanes. – nraynaud

10

Vous devez disposer de fonctions pour la création et la suppression d'objets. Passez ensuite ces fonctions au gestionnaire d'annulation. Voir le fichier démo de mon gestionnaire d'annulation javascript: https://github.com/ArthurClemens/Javascript-Undo-Manager

Le code de démonstration affiche le canevas, mais le code est agnostique.

Il ne contient pas de raccourcis clavier, mais peut vous aider lors des premières étapes.

Moi-même je l'ai utilisé dans une application web avec des boutons pour annuler et refaire, à côté de sauvegarder.

+0

Il est loin d'être suffisant pour gérer les états de l'éditeur transitoire (comme quand un seul point d'une polyligne a été dessiné et pas encore le second), ou les actions d'édition continue qui nécessitent une annulation de compression. – nraynaud

+0

En effet, une approche générique ne fonctionnera pas dans ce cas. Pour les actions continues, vous pouvez choisir de ne stocker que le résultat final. –

+0

le problème est de détecter le "résultat final" comme une propriété directement liée à un curseur (afin que l'utilisateur ait un retour immédiat sur son action), vous ne savez pas quand il a fini de tripoter le curseur. Vous pouvez soit essayer de le déduire avec le temps (2s sans bidouiller le curseur signifie qu'il est fini) mais c'est difficile à obtenir, avec un événement (relâchement du bouton de la souris) sur le contrôle, il suffit de compresser la pile d'annulation à la volée. signifie que vous avez des éléments comparables sur la pile, pas de simples fermetures, ou vous pouvez marquer des groupes d'événements. – nraynaud

5

Voici un échantillon de N-défont en utilisant Knockout JS:

http://jsfiddle.net/paultyng/TmvCs/22/

Il utilise un modèle MVVM si votre état de page est représenté dans un objet javascript qui maintient une histoire pour.

Questions connexes