Ember.js: Injecter dans un assistant

Créé le 4 mai 2015  ·  6Commentaires  ·  Source: emberjs/ember.js

J'ai ceci:

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
};

remarquer:

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

mais dans l'assistant, this.get('applicationController') n'est pas défini :

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);

Dans la documentation, il est dit que vous pouvez injecter dans les assistants, et cette configuration exacte fonctionne sur d'autres classes de framework mais pas ici…

Commentaire le plus utile

Pour tous ceux qui le rencontreront plus tard, les assistants dans Ember 2.x sont désormais de "vrais" objets et peuvent avoir accès à des services (via Ember.inject.service ou des injections basées sur un initialiseur).

Exemple:

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

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

Tous les 6 commentaires

Vous ne pouvez pas injecter dans les assistants. Je pense que les documents ont été mis à jour, mais veuillez m'indiquer l'endroit où vous avez remarqué que cela était possible afin que nous puissions corriger le document...

Ah merde, vous les avez mis à jour pour 1.11. Merci. D'accord, alors dans quelle direction devons-nous aller si nous avons besoin d'accéder à des éléments de conteneur à partir d'assistants et en particulier d'instances Ember.Object simples (qui n'ont pas de propriété de conteneur) ?

@atomkirk Au lieu d'essayer d'injecter quelque chose dans un assistant, vous devez injecter dans un contrôleur/composant et passer l'objet injecté dans l'assistant (ou simplement utiliser une propriété calculée). Ou utilisez simplement un composant au lieu d'un assistant.

Que se passe-t-il si j'utilise un composant d'assistance interne et que j'ai également besoin d'accéder aux données utilisateur que j'injecte normalement dans les routes et les contrôleurs ? Ce n'est pas accessible à l'intérieur de cet assistant.
Le passer à chaque composant ne semble pas efficace, je devrais créer par exemple user.name pour chaque composant, alors que c'est la même chose pour tous. Donc, si j'ai 50 composants, je devrais transmettre la même valeur à 50 composants pour y accéder à partir de l'assistant à l'intérieur du composant ...
Un moyen de résoudre cela ?

Cela a été résolu dans Ember.js 1.13 avec des actions de fermeture. S'il te plait regarde:

Pour tous ceux qui le rencontreront plus tard, les assistants dans Ember 2.x sont désormais de "vrais" objets et peuvent avoir accès à des services (via Ember.inject.service ou des injections basées sur un initialiseur).

Exemple:

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

  compute(params, hash) {
    let i18n = this.get('i18n');
    // stuff here
  }
});
Cette page vous a été utile?
0 / 5 - 0 notes