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!

 61
Author: Taras Mankovski, 2013-08-13

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.

 93
Author: intuitivepixel,
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

 8
Author: Mitchel Kelonye,
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