2014-10-24 2 views
2

У меня есть простой инициализатор, который вводит одноэлементный класс в представления и компоненты. Когда я использую компонент в шаблоне, напримерEmber Component and Dependency Injection

{{component-name}} 

Теперь я могу получить доступ к инжектированному объекту из компонента.

Если я создаю экземпляр компонента из кода:

comp = App.ComponentNameComponent.create() 

нагнетаемый объект является нулевым.

Включает ли инъекции только компоненты, добавленные с помощью шаблона? Есть ли что-то особенное, что мне нужно сделать, чтобы внедрять компоненты, которые я хочу программно использовать?

ответ

4

Для инъекции зависимостей для работы вы должны найти компонент из контейнера. Ember делает это, когда вы используете компонент в шаблоне, но когда вы создаете экземпляр напрямую, что не происходит. Так что если вы хотите, чтобы свойство впрыскивается, вы должны использовать контейнер, как это:

comp = container.lookup('component:component-name'); 

Каждый объект посмотрел контейнером Ember (маршруты, контроллеры, представления и т.д.) автоматически имеет container свойство, добавленное к нему. Поэтому если вы хотите создать экземпляр компонента в контроллере, вы могли бы сделать это:

comp = this.get('container').lookup('component:component-name'); 

Там нет общедоступной документации для контейнера, так что мое предложение было бы просто read the source code.

+0

ах, хорошо, это имеет смысл. lookup выглядит так, как будто возвращает экземпляр. как передать параметры компоненту с помощью этого метода, как вы можете в шаблоне? – typeoneerror

+0

nevermind, выглядит как lookupFactory даст мне ссылку на зарегистрированный компонент, и я могу использовать его для создания экземпляров с параметрами. – typeoneerror

1

Ваш компонент должен быть создан контейнером, чтобы все было правильно введено.

var comp = this.container.lookup('component:component-name');

Объекты, созданные контейнером будет иметь container объект автоматически впрыскивается в него. Другими словами, код выше будет работать только в том случае, если контекстный объект был создан контейнером.