如何使用 Ember CLI 在 Ember 中进行依赖注入?
How to do dependency injection in Ember with Ember CLI?
首先,我制作了一个没有 Ember CLI 的小型 Ember 应用程序。
我有这段代码。
window.MyApp = Ember.Application.create({
ready: function() {
this.register('session:current', MyApp.SessionController, { singleton: true });
this.inject('controller', 'session', 'session:current');
}
});
这有效。
然后我决定用 Ember CLI 从头开始重写所有内容。
我编辑了文件 app/app.js
并添加了 ready
挂钩,就像我以前的版本一样。
var App = Ember.Application.extend({
modulePrefix: config.modulePrefix,
podModulePrefix: config.podModulePrefix,
Resolver: Resolver,
ready: function() {
this.register('session:current', App.SessionController, { singleton: true });
this.inject('controller', 'session', 'session:current');
}
});
这行不通。
会话控制器确实存在。这是文件的内容 app/controllers/session.js
export default Ember.Controller.extend({
isLoggedIn: false,
});
我收到的错误信息是
TypeError: Attempting to register an unknown factory: `session:current`
它出现在浏览器中。
我用谷歌搜索了该消息,但在 Ember CLI 中找不到任何关于依赖项注入的信息。
有什么想法吗?
在 ember-cli 中,您可以使用 ember generate service <name of service>
和 ember generate initializer <name of initializer>
构建存根来实现这一点,这比摆弄 app.js
好得多。
你基本上像这样创建一个服务:
// app/services/notifications.js
import Ember from 'ember';
export default Ember.Object.extend({
initNotifications: function() {
// setup comes here
}.on('init'),
// Implementation snipped, not relevant to the answer.
});
以及初始化程序,它将服务注入到需要它的应用程序组件中:
// app/initializers/notifications-service.js
import Notifications from '../services/notifications';
export default {
name: 'notification-service',
after: 'auth-service',
initialize: function( container, app ) {
app.register( 'notifications:main', Notifications, { singleton: true } );
app.inject( 'component:system-notifications', 'notificationService', 'service:notifications' );
app.inject( 'service:auth', 'notificationService', 'service:notifications' );
}
};
这样,它就可以在指定的组件上作为 notificationService
使用。
有关 Ember 中依赖注入主题的文档可在 http://emberjs.com/guides/understanding-ember/dependency-injection-and-service-lookup/
中找到
首先,我制作了一个没有 Ember CLI 的小型 Ember 应用程序。
我有这段代码。
window.MyApp = Ember.Application.create({
ready: function() {
this.register('session:current', MyApp.SessionController, { singleton: true });
this.inject('controller', 'session', 'session:current');
}
});
这有效。
然后我决定用 Ember CLI 从头开始重写所有内容。
我编辑了文件 app/app.js
并添加了 ready
挂钩,就像我以前的版本一样。
var App = Ember.Application.extend({
modulePrefix: config.modulePrefix,
podModulePrefix: config.podModulePrefix,
Resolver: Resolver,
ready: function() {
this.register('session:current', App.SessionController, { singleton: true });
this.inject('controller', 'session', 'session:current');
}
});
这行不通。
会话控制器确实存在。这是文件的内容 app/controllers/session.js
export default Ember.Controller.extend({
isLoggedIn: false,
});
我收到的错误信息是
TypeError: Attempting to register an unknown factory: `session:current`
它出现在浏览器中。
我用谷歌搜索了该消息,但在 Ember CLI 中找不到任何关于依赖项注入的信息。
有什么想法吗?
在 ember-cli 中,您可以使用 ember generate service <name of service>
和 ember generate initializer <name of initializer>
构建存根来实现这一点,这比摆弄 app.js
好得多。
你基本上像这样创建一个服务:
// app/services/notifications.js
import Ember from 'ember';
export default Ember.Object.extend({
initNotifications: function() {
// setup comes here
}.on('init'),
// Implementation snipped, not relevant to the answer.
});
以及初始化程序,它将服务注入到需要它的应用程序组件中:
// app/initializers/notifications-service.js
import Notifications from '../services/notifications';
export default {
name: 'notification-service',
after: 'auth-service',
initialize: function( container, app ) {
app.register( 'notifications:main', Notifications, { singleton: true } );
app.inject( 'component:system-notifications', 'notificationService', 'service:notifications' );
app.inject( 'service:auth', 'notificationService', 'service:notifications' );
}
};
这样,它就可以在指定的组件上作为 notificationService
使用。
有关 Ember 中依赖注入主题的文档可在 http://emberjs.com/guides/understanding-ember/dependency-injection-and-service-lookup/
中找到