Я пытаюсь понять, как использовать Ember.Application register и inject методы
Для чего предназначены эти функции? Как их использовать и когда?
Мне бы очень хотелось знать!
Я пытаюсь понять, как использовать Ember.Application register и inject методы
Для чего предназначены эти функции? Как их использовать и когда?
Мне бы очень хотелось знать!
Ember по умолчанию выполняет инъекцию зависимостей при загрузке вашего приложения, используя в основном соглашения, например, если вы используете данные ember-данных, тогда экземпляр класса store
вводится в каждом route
и controller
в вашем приложении, поэтому вы можете позже получить ссылку, просто сделав this.get('store')
внутри любого маршрута или контроллера.
Например, вот фрагмент кода, в котором зарегистрирован по умолчанию store
(взятый из source)
Ember.onLoad('Ember.Application', function(Application) {
Application.initializer({
name: "store",
initialize: function(container, application) {
application.register('store:main', application.Store);
...
}
container.lookup('store:main');
}
});
И затем вводится (источник)
Application.initializer({
name: "injectStore",
initialize: function(container, application) {
application.inject('controller', 'store', 'store:main');
application.inject('route', 'store', 'store:main');
application.inject('dataAdapter', 'store', 'store:main');
}
...
});
Другими словами, register
и inject
- это методы регистрации зависимостей и их ввода сами.
Предположим, что у вас есть объект Session
, который вы заполняете после запуска запроса сервера при запуске приложения и с которым вы хотите иметь ссылку на каждом контроллере, вы можете сделать что-то вроде этого:
var App = Ember.Application.create({
ready: function(){
this.register('session:current', App.Session, {singleton: true});
this.inject('controller', 'session', 'session:current');
}
});
App.Session = Ember.Object.extend({
sessionHash: ''
});
Этот код установил бы свойство Session
каждого экземпляра контроллера одному экземпляру App.Session
, поэтому вы могли бы в любом контроллере сделать this.get('session')
и получить ссылку на него, и поскольку он определен как одноэлементный всегда будет тем же самым объектом Session
.
С помощью register
вы можете зарегистрировать контроллеры, модели, представления или любой произвольный тип объекта. inject
, с другой стороны, может вводить все экземпляры данного класса. Например, inject('model', 'session', 'session:current')
также вводит свойство Session
экземпляром session:current
во все модели. Чтобы ввести объект Session
, скажем, на IndexView
вы могли бы сделать inject('view:index', 'session', 'session:current')
.
Хотя register
и inject
являются очень мощными, вы должны использовать их разумно и только в том случае, если вы действительно знаете, что другого пути для достижения своей цели нет, я думаю, что отсутствие документации является показателем обескуражения.
Так как в основном нужно предоставить рабочий пример с объяснением, там он идет: http://jsbin.com/usaluc/6/edit. Обратите внимание, что в этом примере мы можем просто получить доступ к указанному sessionHash
, обратившись к текущему объекту сеанса контроллера с {{controller.session.sessionHash}}
в каждом маршруте, в котором мы находимся, это заслуга того, что мы сделали, зарегистрировав и введя App.Session
объект в каждом контроллере приложения.
Надеюсь, что это поможет.
Общим вариантом использования является предоставление текущего пользовательского свойства loggedin для контроллеров и маршрутов, как в https://github.com/kelonye/ember-user/blob/master/lib/index.js и https://github.com/kelonye/ember-user/blob/master/test/index.js