Как и когда использовать регистр Ember.Application и методы инъекций?

Я пытаюсь понять, как использовать Ember.Application register и inject методы

Для чего предназначены эти функции? Как их использовать и когда?

Мне бы очень хотелось знать!

Ответ 1

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 объект в каждом контроллере приложения.

Надеюсь, что это поможет.