Ember.js: Inyectar en un ayudante

Creado en 4 may. 2015  ·  6Comentarios  ·  Fuente: emberjs/ember.js

Tengo esto:

export function initialize(container, application) {
    application.inject('component', 'store', 'store:main');
    application.inject('component', 'application', 'application:main');
    application.inject('component', 'applicationController', 'controller:application');
    application.inject('helper', 'applicationController', 'controller:application');
    application.inject('model:device', 'application', 'application:main');
    application.inject('model:room', 'application', 'application:main');
    application.inject('model:setting', 'application', 'application:main');
    application.inject('route:application', 'application', 'application:main');
    application.inject('transform', 'application', 'application:main');
}

export default {
  name: 'injections',
  initialize: initialize
};

aviso:

application.inject('helper', 'applicationController', 'controller:application');

pero en el ayudante, this.get('applicationController') no está definido:

import Ember from 'ember';
import environment from '../utils/environment';

export function staticImg(path, options) {
    if (path) {
        var staticRoot = this.get('applicationController').get('model.staticRoot');
        return new Ember.Handlebars.SafeString('<img src="' + environment.staticHost() + staticRoot + path + '" class="' + ( options.hash.classNames || "" ) + '">');
    }
    else {
        return "";
    }
}

export default Ember.Handlebars.makeBoundHelper(staticImg);

En los documentos, dice que puede inyectar en ayudantes, y esta configuración exacta funciona en otras clases de marco, pero no aquí ...

Comentario más útil

Para cualquiera que se encuentre con esto más adelante, los ayudantes en Ember 2.x ahora son objetos "reales" y pueden tener acceso a los servicios (a través de Ember.inject.service o inyecciones basadas en inicializadores).

Ejemplo:

export default Ember.Helper.extend({
  i18n: Ember.inject.service('i18n'),

  compute(params, hash) {
    let i18n = this.get('i18n');
    // stuff here
  }
});

Todos 6 comentarios

No se puede inyectar en ayudantes. Creo que los documentos se han actualizado, pero indíqueme dónde notó que mencionó que esto era posible para que podamos corregir el documento ...

Ah, mierda, los actualizaste para la versión 1.11. Gracias. Bien, entonces, ¿cuál es la dirección en la que debemos ir si necesitamos acceder a las cosas del contenedor desde dentro de los ayudantes y especialmente a las instancias simples de Ember.Object (que no tienen propiedad de contenedor)?

@atomkirk En lugar de intentar inyectar algo en un ayudante, debe inyectar en un controlador / componente y pasar el objeto inyectado al ayudante (o simplemente usar una propiedad calculada). O simplemente use un componente en lugar de un ayudante.

¿Qué sucede si estoy usando un componente interno de ayuda y también necesito acceder a los datos del usuario que normalmente inyecto en las rutas y los controladores? No es accesible dentro de ese ayudante.
Pasarlo a cada componente no parece eficiente, necesitaría hacer, por ejemplo, user.name para cada componente, mientras que es el mismo para todos ellos. Entonces, si tengo 50 componentes, necesitaría pasar el mismo valor a 50 componentes para acceder desde el componente auxiliar interno ...
¿Alguna forma de resolver esto?

Para cualquiera que se encuentre con esto más adelante, los ayudantes en Ember 2.x ahora son objetos "reales" y pueden tener acceso a los servicios (a través de Ember.inject.service o inyecciones basadas en inicializadores).

Ejemplo:

export default Ember.Helper.extend({
  i18n: Ember.inject.service('i18n'),

  compute(params, hash) {
    let i18n = this.get('i18n');
    // stuff here
  }
});
¿Fue útil esta página
0 / 5 - 0 calificaciones