Я читал такие вопросы, как Access EventEmitter Service внутри CustomHttp, где пользователь использует EventEmitter в своем сервисе, но ему было предложено в этом комментарии не использовать его и использовать вместо него Observables непосредственно в своих сервисах.
Я также прочитал этот вопрос, где решение предлагает передать EventEmitter ребенку и подписаться на него.
Мой вопрос: я должен или не должен подписываться вручную на EventEmitter? Как я должен использовать это?
angular
angular2-services
Эрик Мартинес
источник
источник
Ответы:
TL; DR :
Нет, не подписывайтесь на них вручную, не используйте их в сервисах. Используйте их, как показано в документации, только для генерации событий в компонентах. Не побеждайте угловую абстракцию.
Ответ:
Нет, вы не должны подписываться на него вручную.
EventEmitter является абстракцией angular2, и его единственная цель - генерировать события в компонентах. Цитирую комментарий от Роба Вормальда
Это действительно ясно указано в документации к EventEmitter.
Что плохого в его использовании?
Angular2 никогда не гарантирует нам, что EventEmitter останется наблюдаемым. Так что это означает рефакторинг нашего кода, если он меняется. Единственный API, к которому мы должны получить доступ - это его
emit()
метод. Мы никогда не должны подписываться вручную на EventEmitter.Все вышеизложенное более четко видно в комментарии этого Уорд Белла (рекомендуется прочитать статью и ответ на этот комментарий). Цитирование для справки
Его комментарий совпадает с комментарием Роба давным-давно.
Итак, как правильно его использовать?
Просто используйте его для генерации событий из вашего компонента. Посмотрите на следующий пример.
Как не использовать это?
Стоп тут ... ты уже не прав ...
Надеемся, что эти два простых примера прояснят правильное использование EventEmitter.
источник
directives : [Child]
в определении компонента? Это, похоже, не компилируется, и я не могу найти его описанным в документации Angular2.directives
ключевое слово , так как устарел. Используйтеdeclarations
ключевое слово в@NgModule
соответствии с указаниями здесь или здесьДа, идти вперед и использовать его.
EventEmitter
является открытым, документированным типом в окончательном Angular Core API. Основано ли это наObservable
том, не имеет значения; если его документированыemit
иsubscribe
методы соответствуют тому, что вам нужно, тогда используйте его.Как также указано в документах:
Таким образом, они хотели
Observable
подобный объект, который вел себя определенным образом, они реализовали его и сделали его публичным. Если бы это была просто внутренняя угловая абстракция, которую не следует использовать, они бы не сделали ее общедоступной.Есть много случаев, когда полезно иметь эмиттер, который отправляет события определенного типа. Если это ваш вариант использования, пойти на это. Если / когда доступна эталонная реализация спецификации, на которую они ссылаются, она должна быть заменой, как и любой другой полифилл.
Просто убедитесь, что генератор, который вы передаете
subscribe()
функции, соответствует связанной спецификации. Возвращенный объект гарантированно должен иметьunsubscribe
метод, который должен вызываться для освобождения любых ссылок на генератор (в настоящее время это объект RxJs,Subscription
но это действительно деталь реализации, от которой не следует зависеть).Все строго сформулированные предсказания о гибели и унынии, кажется, происходят из одного комментария о переполнении стека от одного разработчика в предварительной версии Angular 2.
источник
Если вы хотите взаимодействовать между компонентами, вам нужно знать, что такое @Input, @Output, EventEmitter и Subjects.
Если отношения между компонентами являются родительскими и дочерними, или наоборот, мы используем @input & @output с генератором событий.
@output испускает событие, и вам нужно отправить его с помощью генератора событий.
Если это не отношения между родителями и детьми ... тогда вы должны использовать предметы или через общий сервис.
источник
Нет: nono и нет: yesyes. Истина в середине И нет причин бояться из-за следующей версии Angular.
С логической точки зрения, если у вас есть компонент, и вы хотите сообщить другим компонентам о том, что что-то происходит, событие должно быть запущено, и это может быть сделано любым способом, который вы (разработчик) считаете нужным. Я не вижу причины, почему бы не использовать его, и я не вижу причины, чтобы использовать его любой ценой. Также имя EventEmitter предлагает мне событие, которое происходит. Я обычно использую его для важных событий, происходящих в Компоненте. Я создаю Службу, но создаю файл Службы внутри Папки компонентов. Таким образом, мой файл службы становится своего рода диспетчером событий или интерфейсом событий, поэтому я могу сразу определить, на какое событие я могу подписаться в текущем компоненте.
Я знаю .. Может быть, я немного старомодный разработчик. Но это не часть модели разработки, управляемой событиями, это часть решений по архитектуре программного обеспечения вашего конкретного проекта.
Некоторые другие ребята могут подумать, что использовать Observables напрямую - это круто. В этом случае перейдите непосредственно к Observables. Вы не серийный убийца, делающий это. Если вы не разработчик психопатов, пока программа работает, делайте это.
источник