2015-01-13 2 views
3

Во-первых, я сделал небольшое приложение Ember без Ember CLI.Как сделать инъекцию зависимости в Ember с Ember CLI?

У меня была эта часть кода.

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.

Любая идея?

ответ

8

В 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/

+0

Какой разницы между службой и инициализатором? –

+1

Услуга - это просто реализация того, чего вы хотите достичь. Инициализатор подключается к запуску приложения и позволяет запускать код во время запуска (например, настройка и ввод службы), поскольку инициализаторы загружаются автоматически, а не по требованию. Это намного чище, чем взломать его в app.js. – Leeft

+0

Я запускал 'ember g service', и это также генерирует инициализатор, поэтому, я думаю, мне не нужно запускать' ember g initializer'? –

Смежные вопросы