在我上面的参考文献中,ember-core团队导入了这个createInjectionHelper并使用它来添加一个干净/简单的api来注入像这样的服务
App.ApplicationRoute = Ember.Route.extend({
authManager: Ember.inject.service('auth'),
model: function() {
return this.get('authManager').findCurrentUser();
}
});
Run Code Online (Sandbox Code Playgroud)
如何为非服务创建这样的东西?
您的示例用法将与上面的内容略有不同.我们将介绍一下injectRepositories的功能.
import injectRepositories from 'app/utils/inject';
export default Ember.Route.extend({
repository: injectRepositories('person'),
model: function() {
var repository = this.get('repository');
return repository.find();
}
});
Run Code Online (Sandbox Code Playgroud)
可以通过以下更改来改进初始化程序:
import registerWithContainer from "ember-cli-auto-register/register";
export function initialize(_, application) {
registerWithContainer("repositories", application);
application.inject("repositories", "store", "store:main");
}
export default {
name: "repositories",
after: "store",
initialize: initialize
};
Run Code Online (Sandbox Code Playgroud)
让我们分解每一行中发生的事情.
registerWithContainer("repositories", application);
Run Code Online (Sandbox Code Playgroud)
在上面的行中,我们将推迟到ember-addon ember-cli-auto-register.在这种情况下,此插件将获取repositories目录并将每个对象注册到Ember容器中,以便能够通过查找进行访问.它们将被插入,就像执行以下操作一样:
application.register("repositories:person", PersonRepository);
Run Code Online (Sandbox Code Playgroud)
然后我们添加一个函数来使用ember-addon ember-cli-injection进行注入:
// app/utils/inject.js
import inject from "ember-cli-injection/inject";
var injectRepositories = inject("repositories");
export default injectRepositories;
Run Code Online (Sandbox Code Playgroud)
这使我们有机会使用上面新创建的函数来访问这些对象,使用以下代码:
import injectRepositories from 'app/utils/inject';
export default Ember.Route.extend({
repository: injectRepositories('person'),
model: function() {
var repository = this.get('repository');
return repository.find();
}
});
Run Code Online (Sandbox Code Playgroud)
由于每个对象现在都在容器中,我们可以在运行时查找并注入,而不是在应用程序初始化期间注入.我们repositories在函数中注册了密钥,然后返回一个计算属性(参见下面的ember-cli-injection代码).我们这样做是一个允许延迟加载的计算属性.在访问属性之前,不会从容器中获取对象.
import Ember from 'ember';
var injection = function(key) {
return function(name) {
return Ember.computed(function(propertyName) {
var objectName = name || propertyName;
return this.container.lookup(key + ':' + objectName);
});
};
};
export default injection;
Run Code Online (Sandbox Code Playgroud)
例如,我们还允许将名称传递给存储库功能repository: injectRepositories('person').这允许您在注入对象时命名对象.
如果您只想将对象命名为与注入容器的存储库名称相同,您也可以这样做person: injectRepositories().这会将person键传递给计算属性propertyName,因为null在注入时objectName会留下名称,而意思是person.这符合API产生类似的结果,但不一样的是,的Ember.inject.service和Ember.inject.controller可用的灰烬1.10的API.
| 归档时间: |
|
| 查看次数: |
760 次 |
| 最近记录: |