web-dev-qa-db-fra.com

Comment et quand utiliser les méthodes d'enregistrement et d'injection d'Ember.Application?

J'essaie de comprendre comment utiliser les méthodes Ember.Application register & inject

Dans quel cas d'utilisation ces fonctions sont-elles conçues? Comment les utiliser et quand?

J'aimerais vraiment savoir!

62
Taras Mankovski

Ember par défaut effectue une injection de dépendance lorsqu'il démarre votre application en utilisant principalement des conventions, par exemple si vous utilisez ember-data alors une instance de la classe store est injectée dans chaque route et controller dans votre application, afin que vous puissiez plus tard obtenir une référence en faisant simplement this.get('store') dans n'importe quelle route ou contrôleur.

Par exemple, voici un extrait de code où le store get par défaut est enregistré (extrait de 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 termes, register et inject sont des méthodes pour enregistrer les dépendances et les injecter vous-même.

Supposons que vous ayez un objet Session que vous remplissez après une demande de serveur au démarrage de l'application et auquel vous souhaitez avoir une référence dans chaque contrôleur, vous pouvez 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 définirait la propriété session de chaque instance de contrôleur sur une instance singleton de App.Session, Donc vous pourriez dans n'importe quel contrôleur faire this.get('session') et obtenir une référence à celle-ci, et comme il est défini comme un singleton, ce serait toujours le même objet session.

Avec register, vous pouvez enregistrer des contrôleurs, des modèles, des vues ou tout type d'objet arbitraire. inject, d'autre part, peut injecter sur toutes instances d'une classe donnée. Par exemple, inject('model', 'session', 'session:current') injecterait également la propriété session avec l'instance session:current Dans tous les modèles. Pour injecter l'objet session, disons sur le IndexView que vous pouvez faire inject('view:index', 'session', 'session:current').

Bien que register et inject soient très puissants, vous devez les utiliser à bon escient et uniquement dans le cas où vous savez vraiment qu'il n'y a pas d'autre moyen d'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

Puisqu'il est surtout indispensable de fournir un exemple de travail avec une explication, c'est parti: http://jsbin.com/usaluc/6/edit . Remarquez comment, dans l'exemple, nous pouvons simplement accéder au sessionHash mentionné en faisant référence à l'objet de session du contrôleur actuel avec {{controller.session.sessionHash}} Dans chaque route dans laquelle nous nous trouvons, c'est le mérite de ce que nous avons fait en enregistrant et injecter l'objet App.Session dans chaque contrôleur de l'application.

J'espère que cela aide.

94
intuitivepixel

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

8
Mitchel Kelonye