Cómo y cuándo usar Ember.Solicitud de registro y métodos de inyección?
Estoy tratando de entender cómo usar Ember.Aplicación registro & inyectar métodos
¿Para qué caso de uso están diseñadas estas funciones? ¿Cómo se van a utilizar y cuándo?
Realmente me gustaría saber!
2 answers
Ember de forma predeterminada hace la inyección de dependencias cuando arranca su aplicación utilizando principalmente convenciones, por ejemplo, si usa ember-data, entonces se inyecta una instancia de la clase store
en cada route
y controller
en su aplicación, por lo que más tarde puede obtener una referencia simplemente haciendo this.get('store')
dentro de cualquier ruta o controlador.
Por ejemplo, aquí hay un extracto de código donde se registra el valor predeterminado store
get (tomado de la fuente )
Ember.onLoad('Ember.Application', function(Application) {
Application.initializer({
name: "store",
initialize: function(container, application) {
application.register('store:main', application.Store);
...
}
container.lookup('store:main');
}
});
Y luego inyectado (fuente)
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 otras palabras register
y inject
son métodos para registrar dependencias e inyectarlas usted mismo.
Supongamos que tiene un objeto Session
que rellena después de una solicitud del servidor al iniciar la aplicación, y al que desea tener una referencia en cada controlador, podría hacer algo como esto:
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: ''
});
Este código establecería la propiedad session
de cada instancia de controlador a una instancia de un solo controlador de App.Session
, por lo que podría controlador do this.get('session')
y obtener una referencia a él, y ya que se define como un singleton sería siempre el mismo objeto session
.
Con register
puede registrar controladores, modelos, vistas o cualquier tipo de objeto arbitrario. inject
, por otro lado, puede inyectar en todas las instancias de una clase dada. Por ejemplo, inject('model', 'session', 'session:current')
también inyectaría la propiedad session
con la instancia session:current
en todos los modelos. Para inyectar el objeto session
, digamos que en el IndexView
podría hacer inject('view:index', 'session', 'session:current')
.
Aunque register
y inject
son muy poderosos, debes usarlos sabiamente y solo en el caso de que realmente sepas que no hay otra manera de lograr tu objetivo, supongo que la falta de documentación es un indicador de desaliento.
Actualización - No hay una buena explicación sin un ejemplo de trabajo
Dado que en su mayoría es imprescindible proporcionar un ejemplo de trabajo con una explicación, ahí va: http://jsbin.com/usaluc/6/edit. Observe cómo en el ejemplo podemos simplemente acceder al sessionHash
mencionado haciendo referencia al objeto de sesión del controlador actual con {{controller.session.sessionHash}}
en cada ruta en la que nos encontramos, este es el mérito de lo que hemos hecho al registrar e inyectar el objeto App.Session
en cada controlador de la aplicación.
Espero que ayude.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-14 20:59:19
Un caso de uso común es proporcionar la propiedad de usuario loggedin actual a los controladores y rutas como en https://github.com/kelonye/ember-user/blob/master/lib/index.js y https://github.com/kelonye/ember-user/blob/master/test/index.js
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-14 12:33:33