6
votes

Ember.js Routeur Action à contrôleur

Lorsque j'utilise le routeur Ember, comment puis-je définir des actions dans le modèle connecté au contrôleur?

Un exemple est ici: http://jsfiddle.net/kvj38/3/ p>

Unter mon profil sont deux actions: On est défini sur l'état et travaille Deux est défini sur le contrôleur. Comment puis-je faire ce travail ou devrais-je utiliser une autre approche? P>

App.Router = Em.Router.extend({
  enableLogging: true,
  location: 'hash',

  root: Em.State.extend({
    // EVENTS
    goHome: Ember.State.transitionTo('home'),
    viewProfile: Ember.State.transitionTo('profile'),

    // STATES
    home: Em.State.extend({
      route: '/',
      connectOutlets: function(router, context) {
        var appController = router.get('applicationController');
        appController.connectOutlet(App.HomeView);
      }
     }),

    // STATES
    profile: Em.State.extend({
      route: '/profile',
        connectOutlets: function(router, context) {
          var appController = router.get('applicationController');
          appController.connectOutlet(App.ProfileView);
        }
    }),

    one: function() {
      alert("eins");
    },
  }) 
});


0 commentaires

3 Réponses :


13
votes

La cible par défaut d'une action est le routeur, mais vous pouvez définir un autre dans le modèle: xxx

et ajouter une fonction "deux" dans "app.profilecontroller".

mise à jour

Cette réponse a été correcte au milieu de 2012. (septembre 2014), la documentation indique:

par défaut , le {{action}} L'assistant déclenche une méthode sur le contrôleur du modèle. [...] Si le contrôleur ne met pas en œuvre une méthode avec le même nom que l'action dans son objet Actions, l'action sera envoyée au routeur, où la route des feuilles actuellement active aura une chance de gérer l'action. [...] Si ni le contrôleur du modèle ni l'itinéraire actuellement actif n'entraînent un gestionnaire, l'action continuera à buller sur n'importe quel itinéraire parent. En fin de compte, si un ApplicationRoute est défini, il aura la possibilité de gérer l'action. Lorsqu'une action est déclenchée, mais aucun gestionnaire d'action correspondant n'est implémenté sur le contrôleur, l'itinéraire actuel ou l'un des ancêtres de la route actuelle, une erreur sera lancée.


3 commentaires

En fait, la cible par défaut d'une action est le contrôleur contenant, puis le routeur. Voici un exemple JSBIN montrant que le contrôleur gère l'action lorsqu'il est défini à la fois sur le contrôleur et la route: emberjs.jsbin.com/tupil/3/edit . Et voici les documents Ember sur les actions: emberjs.com/guides/templates/actions


Du Docs: "Par défaut, l'assistant {{action}} déclenche une méthode sur le contrôleur de modèle" emberjs.com/guides/templates/actions/#toc_action-Bubbling


@bantic tu as raison. Ember.js a beaucoup changé depuis 2012 et ma réponse n'est plus correcte. Mis à jour maintenant. Merci!



0
votes

Le contrôleur ne doit pas être "directement" en charge de l'événement d'action. L'état / la route est.

Je crois https://github.com/emberjs/ember.js/issues/ 1015 vous aidera.


1 commentaires

Merci. Ce lien est utile! Mais, qu'est-ce qui concerne la vue? Pourquoi n'est-ce pas la vue par défaut? jsfiddle.net/kvj38/9



4
votes

Vous pouvez spécifier l'attribut cible explicitement, comme indiqué par @ Stéphane, afin d'envoyer l'action ailleurs.

Si non spécifié, la cible d'une assistante d'action est le contrôleur.Target. Comme vous l'avez noté, cela est généralement défini sur le routeur.

Si vous avez un modèle dans lequel vous souhaitez que la cible par défaut soit différente, vous pouvez faire cela se produire en définissant la propriété cible du contrôleur. Par exemple, pour définir la cible sur le contrôleur lui-même: xxx


1 commentaires

En outre, pour la manipulation d'action, tandis que la séquence indique ... Contrôleur de courant, puis la route actuelle, puis d'autres itinéraires actifs ... Cela signifie-t-il que pour le parent, seuls les itinéraires ont une chance de gérer (et non les contrôleurs. contrôleurs parent)?