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 ...
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?
Isso foi abordado no Ember.js 1.13 com ações de fechamento. Por favor, veja:
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
}
});
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: