EmberJS - injeção de dependência
É um processo de fornecer dependências de um objeto a outro e usado por um aplicativo Ember para declarar e instanciar os objetos e classes de dependência entre eles. Os Ember.Application e Ember.ApplicationInstance aulas desempenhar um papel importante na implementação Dependency Injection do Ember.
A classe Ember.Application declara e configura os objetos e é usada como 'registro' para declarações de dependência, onde a classe Ember.ApplicationInstance atua como 'proprietário' para objetos instanciados. No entanto, a classe Ember.Application atua como registro primário para um aplicativo e cada classe Ember.ApplicationInstance serve como registro.
Registros de fábrica
Uma fábrica especifica uma parte do aplicativo, como rota, modelo, etc. e é registrada com uma chave específica. Por exemplo, o modelo de índice é definido com modelo: índice e a rota do aplicativo é definida com rota: aplicativo .
A chave de registro inclui duas partes; um é o tipo de fábrica e o segundo é o nome da fábrica e ambos os segmentos são divididos por dois pontos (:). Por exemplo, você pode inicializar o aplicativo registrando a fábrica do Logger com a chave logger: principal .
application.register('mylog:logmsg', MyLogger);
Injeções de fábrica
A fábrica pode ser injetada, uma vez cadastrada. Por exemplo, considere o seguinte código -
application.inject('route', 'mylog', 'mylog:logmsg');
Todos os tipos de fábricas de rota serão representados com a propriedade mylog e o valor para esta propriedade virá da fábrica mylog: logmsg . Você também pode injetar em uma fábrica específica usando a chave completa como -
application.inject('route:index', 'mylog', 'mylog:logmsg');
Aqui, apenas a propriedade mylog será injetada na rota do índice.
Pesquisas de instância de fábrica
Você pode usar o método de pesquisa da instância de fábrica em uma instância de aplicativo para obter uma fábrica instanciada do aplicativo em execução. Ele usa uma string para determinar a fábrica e retorna um objeto.
Por exemplo, você pode chamar o método lookup em uma instância do aplicativo para buscar uma fábrica instanciada, conforme mostrado abaixo -
applicationInstance.lookup('factory-type:factory-name');
Exemplo
O exemplo a seguir mostra o uso de registro de fábrica, injeção e pesquisas de instância no aplicativo Ember. Crie um componente com o nome de injeção de dependência que será definido em app / components / . Abra o arquivo dependency-inject.js e adicione o seguinte código -
import Ember from 'ember';
var inject = Ember.inject;
export default Ember.Component.extend ({
//load the service in the file /app/services/message.js
message: inject.service(),
message: 'Click the above button to change text!!!',
actions: {
pressMe: function () {
//after clicking button, above message will get display at console
var testText = this.get('start').thisistest();
this.set('message', testText);
//after clicking button, it will enter in the component page
this.get('logger').log('Entered in component!');
},
scheduleTasks: function () {
//scheduling work on specific queues like "sync" or "afterRender"
Ember.run.schedule('afterRender', this, function () {
console.log("CUSTOM: I'm in afterRender");
Ember.run.schedule('sync', this, function () {
console.log("CUSTOM: I'm back in sync");
});
});
}
}
});
Agora abra o arquivo de modelo de componente app / templates / components / dependency-inject.hbs e insira o seguinte código -
<button {{action "pressMe"}}>Click Here</button><br>
<h2>{{message}}</h2>
<button {{action "scheduleTasks"}}>Schedule Tasks!</button>
{{yield}}
Abra o arquivo application.hbs e adicione a seguinte linha de código -
{{dependency-inject}}
{{outlet}}
Precisamos criar um inicializador para configurar um aplicativo usando o seguinte comando -
ember generate initializer init
Abra o arquivo init.js que é criado em app / initializers / e adicione o seguinte código -
export function initialize(app) {
//injecting the 'start' property into the component
app.inject('component', 'start', 'service:message');
}
export default {
//initializer name
name: 'init',
initialize: initialize
};
Crie um serviço que pode ser disponibilizado nas diferentes partes da aplicação. Use o seguinte comando para criar o serviço -
ember generate service message
Agora abra o arquivo de serviço message.js que é criado em app / services / com o seguinte código -
import Ember from 'ember';
export default Ember.Service.extend ({
isAuthenticated: true,
//after clicking the button, 'thisistest()' triggers and display the below text
thisistest: function () {
return "Welcome to Tutorialspoint!!!";
}
});
Em seguida, crie um inicializador que configure o aplicativo durante a inicialização. O inicializador pode ser criado usando o seguinte comando -
ember generate initializer logger
Abra o arquivo inicializador logger.js que é criado em app / initializers / com o seguinte código -
import Ember from 'ember';
//it is an application initializer that run as your application boots
export function initialize(application) {
var Logger = Ember.Object.extend({
log(m) {
console.log(m);
}
});
//Registration key includes two parts; one is factory type and second is
name of factory
application.register('logger:main', Logger);
//Once a factory is registered, it can be injected by using 'application.inject'
along with 'logger' property
//and value for this property will come from 'logger:main'factory
application.inject('component:dependency-inject', 'logger', 'logger:main');
}
export default {
name: 'logger',
initialize: initialize
};
Em seguida, crie o inicializador de instância para um aplicativo usando o seguinte comando -
ember generate instance-initializer logger
Abra o arquivo inicializador logger.js que é criado em app / instance-initializers / com o seguinte código -
//Application instance initializers run as an application instance is loaded
export function initialize(applicationInstance) {
var logger = applicationInstance.lookup('logger:main');
//it indicates that instance has booted at console log
logger.log('Hello...This message is from an instance-initializer!');
}
export default {
//it is an instance initializer name
name: 'logger',
initialize: initialize
};
Resultado
Execute o servidor ember; você receberá a seguinte saída -
Em seguida, clique no botão Clique aqui , ele exibirá o texto da página de serviço conforme mostrado na imagem abaixo -
Agora vá para o console e verifique se há mensagens de log que são exibidas a partir dos inicializadores de instância depois que o texto é exibido como na imagem anterior -
Em seguida, clique no botão Agendar Tarefas para agendar o trabalho nas filas que são processadas na ordem de prioridade -