Я пытаюсь понять, как использовать 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