У меня есть ListComponent. При щелчке по элементу в ListComponent подробности этого элемента должны отображаться в DetailComponent. Оба отображаются на экране одновременно, поэтому маршрутизация не требуется.
Как мне сообщить DetailComponent, какой элемент в ListComponent был нажат?
Я подумал о том, чтобы передать событие родительскому элементу (AppComponent), и чтобы родитель установил selectedItem.id на DetailComponent с @Input. Или я мог бы использовать общий сервис с наблюдаемыми подписками.
РЕДАКТИРОВАТЬ: установка выбранного элемента через событие + @Input не запускает компонент DetailComponent, хотя на тот случай, если мне понадобится выполнить дополнительный код. Так что я не уверен, что это приемлемое решение.
Но оба эти метода кажутся намного более сложными, чем способ выполнения действий в Angular 1, который осуществлялся либо через $ rootScope. $ Broadcast, либо через $ scope. $ Parent. $ Broadcast.
Поскольку все в Angular 2 является компонентом, я удивлен, что больше нет информации о взаимодействии компонентов.
Есть ли другой / более простой способ сделать это?
источник
Ответы:
Обновлено до rc.4: при попытке получить данные, передаваемые между одноуровневыми компонентами в angular 2, самый простой способ прямо сейчас (angular.rc.4) - воспользоваться преимуществами иерархической инъекции зависимостей angular2 и создать общую службу.
Вот бы услуга:
Теперь это компонент PARENT
и его двое детей
ребенок 1
ребенок 2 (это брат или сестра)
СЕЙЧАС: на что следует обратить внимание при использовании этого метода.
источник
directives
больше не объявляются в компоненте.В случае двух разных компонентов (не вложенных компонентов, parent \ child \ grandchild) я предлагаю вам следующее:
источник
Один из способов сделать это - использовать общий сервис .
Однако я считаю следующее решение намного проще: оно позволяет обмениваться данными между двумя братьями и сестрами (я тестировал это только на Angular 5 ).
В шаблоне родительского компонента:
приложение-sibling2.component.ts
источник
Об этом идет обсуждение.
https://github.com/angular/angular.io/issues/2663
Ответ Alex J хорош, но он больше не работает с текущим Angular 4 по состоянию на июль 2017 года.
И эта плункерная ссылка продемонстрирует, как общаться между братьями и сестрами, используя общие службы и наблюдаемые.
https://embed.plnkr.co/P8xCEwSKgcOg07pwDrlO/
источник
В определенных ситуациях директива может иметь смысл для «соединения» компонентов. Фактически, соединяемые объекты даже не обязательно должны быть полными компонентами, а иногда это легче и проще, если это не так.
Например, у меня есть
Youtube Player
компонент (обертка Youtube API), и мне нужны для него кнопки контроллера. Единственная причина, по которой кнопки не являются частью моего основного компонента, состоит в том, что они расположены где-то в другом месте DOM.В данном случае это действительно просто компонент «расширения», который будет использоваться только с «родительским» компонентом. Я говорю «родительский», но в DOM это «брат» - так что называйте это как хотите.
Как я уже сказал, это даже не обязательно должен быть полноценный компонент, в моем случае это просто
<button>
(но это может быть компонент).В HTML для
ProductPage.component
, гдеyoutube-player
, очевидно, находится мой компонент, который обертывает Youtube API.Директива подключает все для меня, и мне не нужно объявлять событие (щелчок) в HTML.
Таким образом, директива может легко подключаться к видеоплееру без необходимости участия в
ProductPage
качестве посредника.Я впервые это сделал, поэтому еще не уверен, насколько это может быть масштабируемым для более сложных ситуаций. Хотя я счастлив и это оставляет мой HTML простым и четким.
источник
player
. Если я оставлю первое упоминание игрока, я получу rangeError. Я не понимаю, как это должно работать._player
для частного поля, представляющего игрока, так что да, вы получите сообщение об ошибке, если скопируете это точно. Буду обновлять. Сожалею!Вот простое практическое объяснение: просто объяснено здесь
В call.service.ts
Компонент, из которого вы хотите вызвать наблюдаемый, чтобы сообщить другому компоненту, что кнопка нажата
Компонент, в котором вы хотите выполнить действие при нажатии кнопки на другом компоненте
Я ясно понимаю взаимодействие компонентов, прочитав это: http://musttoknow.com/angular-4-angular-5-communicate-two-components-using-observable-subject/
источник
Общий сервис - хорошее решение этой проблемы. Если вы также хотите сохранить некоторую информацию о деятельности, вы можете добавить общую службу в список поставщиков основных модулей (app.module).
Затем вы можете напрямую предоставить его своим компонентам,
С помощью общей службы вы можете использовать функции или создать тему для одновременного обновления нескольких мест.
В компоненте списка вы можете опубликовать информацию о выбранном элементе,
а затем вы можете получить эту информацию в своем компоненте сведений:
Очевидно, что данные, в которых перечислены общие компоненты, могут быть любыми. Надеюсь это поможет.
источник
Вам необходимо настроить родительско-дочерние отношения между вашими компонентами. Проблема в том, что вы можете просто вставить дочерние компоненты в конструктор родительского компонента и сохранить их в локальной переменной. Вместо этого вы должны объявить дочерние компоненты в родительском компоненте с помощью
@ViewChild
декларатора свойств. Вот как должен выглядеть ваш родительский компонент:https://angular.io/docs/ts/latest/api/core/index/ViewChild-var.html
https://angular.io/docs/ts/latest/cookbook/component-communication.html#parent-to-view-child
Остерегайтесь, дочерний компонент не будет доступен в конструкторе родительского компонента сразу после
ngAfterViewInit
вызова ловушки жизненного цикла. Чтобы поймать этот хук, просто реализуйтеAfterViewInit
интерфейс в родительском классе так же, как и сOnInit
.Но есть и другие деклараторы свойств, как описано в этой заметке блога: http://blog.mgechev.com/2016/01/23/angular2-viewchildren-contentchildren-difference-viewproviders/
источник
Субъекты поведения. Я написал об этом в блоге .
В этом примере я объявляю субъект поведения noid с номером типа. Также это наблюдаемое. А если «что-то случилось», это изменится с помощью функции new () {}.
Итак, в дочерних компонентах один будет вызывать функцию, чтобы внести изменение, а другой будет затронут этим изменением, или наоборот.
Например, я получаю идентификатор из URL-адреса и обновляю noid из объекта поведения.
А с другой стороны, я могу спросить, является ли этот идентификатор «тем, что я хочу», и после этого сделать выбор. В моем случае, если я хочу удалить задачу, и эта задача является текущим URL-адресом, она должна перенаправить меня. в дом:
источник
Это не совсем то, что вам нужно, но наверняка вам поможет
Я удивлен, что нет дополнительной информации о взаимодействии компонентов <=> рассмотрите этот урок от angualr2
Для связи с родственными компонентами я бы посоветовал пойти с
sharedService
. Однако есть и другие варианты.Пожалуйста, обратитесь к ссылке вверху для получения большего количества кода.
Изменить: это очень маленькая демонстрация. Вы уже упомянули, что уже пробовали
sharedService
. Поэтому, пожалуйста, ознакомьтесь с этим руководством angualr2 для получения дополнительной информации.источник
Я передавал методы установки от родительского элемента одному из его дочерних элементов через привязку, вызывая этот метод с данными из дочернего компонента, что означает, что родительский компонент обновляется и затем может обновлять свой второй дочерний компонент новыми данными. Однако для этого требуется привязка this или использование функции стрелки.
Это дает преимущество в том, что дети не так связаны друг с другом, поскольку им не нужна конкретная общая служба.
Я не совсем уверен, что это лучшая практика, было бы интересно услышать мнение других по этому поводу.
источник