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!
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.
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.
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