Ember.js: Injetar em um ajudante

Criado em 4 mai. 2015  ·  6Comentários  ·  Fonte: emberjs/ember.js

Eu tenho isto:

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

perceber:

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

mas no auxiliar, this.get('applicationController') não 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);

Nos documentos, diz que você pode injetar em ajudantes e esta configuração exata funcionando em outras classes do framework, mas não aqui ...

Comentários muito úteis

Para qualquer um que descobrir isso mais tarde, os ajudantes no Ember 2.x agora são objetos "reais" e podem ter acesso a serviços (por meio de Ember.inject.service ou injeções baseadas no inicializador).

Exemplo:

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

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

Todos 6 comentários

Você não pode injetar em ajudantes. Acredito que os documentos foram atualizados, mas indique-me onde você percebeu que isso era possível para que possamos corrigir o documento ...

Que merda, você os atualizou para 1.11. Obrigado. Ok, então qual é a direção que devemos seguir se precisarmos acessar as coisas do container de dentro dos helpers e especialmente instâncias simples do Ember.Object (que não têm propriedade do container)?

@atomkirk Em vez de tentar injetar algo em um helper, você deve injetar em um controlador / componente e passar o objeto injetado para o helper (ou apenas usar uma propriedade computada). Ou apenas use um componente em vez de um auxiliar.

E se eu estiver usando o helper dentro do componente e também precisar acessar os dados do usuário que normalmente injeto nas rotas e nos controladores? Não é acessível dentro desse ajudante.
Passá-lo para todos os componentes não parece eficiente, eu precisaria fazer, por exemplo, user.name para todos os componentes, embora seja o mesmo para todos eles. Então, se eu tiver 50 componentes, eu precisaria passar o mesmo valor para 50 componentes para acessá-lo a partir do componente interno auxiliar ...
Alguma maneira de resolver isso?

Para qualquer um que descobrir isso mais tarde, os ajudantes no Ember 2.x agora são objetos "reais" e podem ter acesso a serviços (por meio de Ember.inject.service ou injeções baseadas no inicializador).

Exemplo:

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

  compute(params, hash) {
    let i18n = this.get('i18n');
    // stuff here
  }
});
Esta página foi útil?
0 / 5 - 0 avaliações