62 votes

Comment et quand utiliser le registre Ember.Application et injecter des méthodes ?

J'essaie de comprendre comment utiliser Ember.Application enregistrer et injecter des méthodes

A quoi servent ces fonctions? Comment doivent-ils être utilisés et quand?

J'aimerais vraiment savoir!

94voto

intuitivepixel Points 17514

Ember par défaut de l'injection de dépendances lors du démarrage de votre application à l'aide de la plupart des conventions, par exemple si vous utilisez ember-data alors une instance de l' store classe est injecté dans chaque route et controller dans votre application, de sorte que vous pouvez ensuite faire référence simplement en faisant this.get('store') à l'intérieur de n'importe quelle route ou de contrôleur.

Par exemple, voici un code extrait où la valeur par défaut store est enregistrée (prises à partir de la source)

Ember.onLoad('Ember.Application', function(Application) {
  Application.initializer({
    name: "store",

    initialize: function(container, application) {
      application.register('store:main', application.Store);
      ...
    }

    container.lookup('store:main');
  }
});

Et puis injecté (source)

Application.initializer({
  name: "injectStore",

  initialize: function(container, application) {
    application.inject('controller', 'store', 'store:main');
    application.inject('route', 'store', 'store:main');
    application.inject('dataAdapter', 'store', 'store:main');
  }
  ...
});

En d'autres mots, register et inject sont des méthodes pour enregistrer les dépendances et de les injecter vous-même.

Supposons que vous avez un Session objet dont vous remplissez après une demande de serveur au démarrage de l'application, et que vous voulez avoir une référence dans chaque contrôleur, vous pourriez faire quelque chose comme ceci:

var App = Ember.Application.create({
  ready: function(){
    this.register('session:current', App.Session, {singleton: true});
    this.inject('controller', 'session', 'session:current');
  }
});

App.Session = Ember.Object.extend({
  sessionHash: ''
});

Ce code devrait définir l' session de la propriété de chaque instance du contrôleur à une instance du singleton de App.Session, de sorte que vous pouvez dans n'importe quel contrôleur n' this.get('session') et obtenir une référence à elle, et depuis il est défini comme un singleton, il serait toujours le même session objet.

Avec register vous pouvez vous inscrire contrôleurs, modèles, vues, ou de n'importe quel type d'objet. inject, dans l'autre main, peut injecter sur toutes les instances d'une classe donnée. Par exemple inject('model', 'session', 'session:current') serait également d'injecter de l' session de la propriété avec l' session:current instance dans tous les modèles. Pour injecter de l' session objet, disons, sur l' IndexView on pouvait faire de l' inject('view:index', 'session', 'session:current').

Barbante register et inject sont très puissants vous devez les utiliser à bon escient et seulement dans le cas que vous savez vraiment il n'y a pas d'autre chemin pour atteindre votre objectif, je suppose que le manque de documentation est un indicateur de découragement.

Mise à jour - Pas de bonne explication, sans un exemple de travail

Puisque C'est surtout un doit de fournir un exemple de travail avec une explication, là, il va: http://jsbin.com/usaluc/6/edit. Notez que dans l'exemple, on peut simplement accéder à la mentionné sessionHash en se référant à l'actuel contrôleur de session de l'objet avec l' {{controller.session.sessionHash}} dans chaque itinéraire que nous sommes, c'est le mérite de ce que nous avons fait en vous inscrivant et d'injecter de l' App.Session objet dans chaque contrôleur de l'application.

Espérons que cela aide.

8voto

Mitchel Kelonye Points 81

Un cas d'utilisation courant consiste à fournir aux contrôleurs et aux routes la propriété utilisateur actuellement connectée, comme indiqué dans https://github.com/kelonye/ember-user/blob/master/lib/index.js et https://github.com/. kelonye / utilisateur-membre / blob / master / test / index.js

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X