Компонент как инъекционный?

Я пытаюсь создать свой собственный модальный компонент, который я мог бы повторно использовать в своих приложениях Angular2. Я рассматриваю разные подходы, и мне интересно, можно ли создать @Component, который также служит @Injectable? Я рассматриваю это, так как хочу создать шаблон для модального окна и хранить его в одном месте.

Спасибо


person alegrowski    schedule 08.04.2016    source источник


Ответы (1)


Компонент является инъекционным по умолчанию. @Component() (или @Directive()) включает @Injectable().

Не ожидайте, что вы получите конкретный экземпляр компонента. Это работает, например, с constructor(@Host() private parentComponent), где поиск DI ограничен родительскими инжекторами до инжектора хост-элемента.

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

person Günter Zöchbauer    schedule 08.04.2016
comment
Так я могу ввести его в конструкторе? - person alegrowski; 08.04.2016
comment
Я обновил свой ответ. Я не думаю, что использование DI принесет вам много пользы для вашего варианта использования. - person Günter Zöchbauer; 08.04.2016
comment
Гюнтер, у меня всегда было впечатление, что внедрение конструктора типа компонента работает только тогда, когда существует родитель этого типа для компонента, пытающегося внедрить его, и в этом случае внедряемый экземпляр является экземпляром ближайшего родителя этот тип (и что это служит (очень полезной) цели, позволяя компонентам вводить родителей с произвольным типом). Это впечатление неверно? - person drew moore; 08.04.2016
comment
@drewmoore Именно это я пытался объяснить в своем ответе (2-й абзац). - person Günter Zöchbauer; 08.04.2016
comment
@GünterZöchbauer, должен ли я просто инициализировать новый компонент, например: var modal = new Modal()? - person alegrowski; 08.04.2016
comment
Если вы хотите создать новый экземпляр компонента во время выполнения, используйте DynamicComponentLoader здесь, в SO, есть много связанных вопросов для получения более подробной информации. - person Günter Zöchbauer; 08.04.2016
comment
Гюнтер, поправьте меня, если я ошибаюсь, но я считаю, что @Parent был удален из API, и вместо него следует использовать @Inject. - person drew moore; 14.04.2016
comment
@Inject() и @Parent() это разные вещи. @Inject() позволяет указать ключ для DI, который отличается от типа параметра конструктора. Кажется, вы правы насчет @Parent. @Host() кажется наиболее близким к удаленному @Parent(). Большое спасибо, что указали на это. Я обновлю свой ответ. Единственная информация, которую я нашел об этом, это комментарий к stackoverflow.com/q/31834527/217408. - person Günter Zöchbauer; 14.04.2016
comment
Интересно - вы правы в том, что это еще недостаточно документировано... Посмотрите на это - в какой-то момент по крайней мере, @Inject в этом контексте служил чему-то вроде перегруженной цели. Насколько я понимаю, @Inject найдет родителя с соответствующим типом в любом месте иерархии над целью, а @Host будет смотреть только на непосредственный элемент хоста. Это, похоже, не подтверждается документацией, хотя - person drew moore; 19.04.2016