2012-06-25 4 views
8

J'essaie de comprendre si les états dans Ember.js sont uniquement conçus/supposés être définis dans un gestionnaire de routes, et si les routes sont intégrées à Ember. À peu près tous les guides que j'ai vu semblent supposer que vous voulez des états et des routes correspondant exactement.Etats dans Ember.js sans utiliser les routes?

Je souhaite créer des états qui ne dépendent pas des itinéraires, mais uniquement de l'état de l'application. Par exemple, dans un client de messagerie, je pourrais avoir un état "userHasSpecifiedRecipient". Seulement si cet état est vrai, je peux activer la boîte de message du formulaire. Mais évidemment, je ne veux pas l'URL à: Y at-il des exemples de

myEmailClient.com#composingMessage_userHasSpecifiedRecipient_userIs... etc.

cela?

Deuxième question: Puis-je mélanger des états couplés avec des routes et des états qui ne le sont pas?

Enfin: j'ai vu quelques conseils qui recommandent aux gens d'utiliser l'addon sproutcore-statechart d'Ember s'ils veulent des choses comme des états simultanés. Est-ce toujours vrai?

Répondre

4

En EmberJS, il y a une mise en œuvre d'un Finite State Machine, Ember.StateManager. Le StateManager utilise Ember.State pour représenter les états dans la machine d'état, qui ont des fonctions enter et exit, etc. Jetez un coup d'œil à Class: Ember.StateManager.

Pour un exemple utilisant StateManager, Ember.View l'utilise pour gérer les différents états d'une vue. Un autre exemple est Ember-Data, qui utilise un gestionnaire d'état pour suivre les différents états qu'un enregistrement peut avoir. Pour faciliter la vie et éviter le code standard, il existe une implémentation Router dans la dernière version d'EmberJS, qui est encore un travail en cours, avec des mises à jour une ou deux fois par semaine. Vous pouvez trouver les dernières sur le GitHub downloads.

Ember.Router est la sous-classe de Ember.StateManager responsable de fournir la détection d'état d'application basée sur l'URL. L'instance Ember.Router d'une application détecte l'URL du navigateur au moment du chargement de l'application et tente de la faire correspondre à un état d'application spécifique. De plus, le routeur met à jour l'URL pour refléter les changements d'état d'une application au fil du temps. (JSDoc in Ember source)

En outre, parce que le Ember.Router étend Ember.StateManager et Ember.Route étend Ember.State, ceux-ci sont interchangeables. En fait, juste un jour un peu plus de soutien a été fait pour soutenir le mélange d'états et de routes, voir Support basic States inside of Routes.

2

Vous pouvez modifier l'implémentation de l'emplacement des routeurs sur «aucun» pour désactiver ces fonctionnalités. les autres méthodes sont 'hash' ou 'history' (avec l'actuel ember-latest.js sur github).

https://github.com/joliss/ember.js/blob/50aff86ef5b6847108bc8c32364171815c230d36/packages/ember-application/lib/system/location.js

App.Router = Ember.Router.extend({ 
    location : Ember.Location.create({ 
     implementation : 'none' 
    }) 
}); 
+1

Je viens aussi de trouver un [exemple par Yehuda] assez récent (https://gist.github.com/2679013) qui utilise Ember.StateManager au lieu de Ember.Router. Ce dernier est ce que la documentation utilise. Quelle est la différence entre eux? –

+0

Aussi, en ce qui concerne ma deuxième question ci-dessus, que se passe-t-il si je veux avoir un sous-ensemble d'états couplés à des routes? Dans ce cas, je ne voudrais pas que l'emplacement soit entièrement désactivé. (Si ce mélange est difficile, cependant, ce n'est pas si important et je peux mettre en place des routes d'une autre manière. –

+0

Oh, ou devrais-je avoir deux StateManagers différents, un avec des emplacements et un sans? –