2017-01-31 3 views
6

Я очень новый в угловом 2. У меня есть проблема для связи между двумя компонентами. Когда у меня есть макет с родителем и некоторыми дочерними компонентами, легко установить переменные дочерних компонентов с помощью аннотации @Input.Общайтесь между двумя дочерними компонентами в угловом 2

Но теперь у меня есть макет одного родительского компонента (который в основном для компоновки) и двух компонентов детей:

example Layout

Ребенок компонент 2 есть куча кнопок, что создает только простой сообщение. Теперь я хочу отобразить это сообщение в дочернем компоненте один.

Как его разрешить? Заранее благодарен

+0

Пожалуйста, пост код, который демонстрирует что вы пытаетесь выполнить. –

+0

Вам необходимо использовать общую услугу. Дополнительная информация [Angular2 - Как обмениваться данными/изменениями между компонентами] (http://stackoverflow.com/questions/35878160/angular2-how-to-share-data-change-between-components) – user1078685

+0

@ user1078685 он может, он не нужно. –

ответ

4

Вы можете использовать @ViewChild и @Output для обновления свойств дочернего компонента.

В качестве альтернативы вы можете использовать @Input вместо @ViewChild.

Подход, предложенный seidme, также будет работать отлично. Это зависит только от вашего варианта использования.

Пример использования @ViewChild и @Output: https://plnkr.co/edit/r4KjoxLCFqkGzE1OkaQc?p=preview

Пример использования @Input и @Output https://plnkr.co/edit/01iRyNSvOnOG1T03xUME?p=preview

+0

выглядит как самый простой способ. спасибо за образец плункера, чтобы лучше подхалимать. Теперь он хорошо работает – Surras

5

Простым способом является установка вывода с @Output в дочернем компоненте2 в качестве события и передача события с сообщением, переданным в виде данных об этом при нажатии кнопки. Затем прослушайте это событие в своем родительском компоненте и обновите свойство, которое устанавливается как вход вашего дочернего компонента1 при возникновении события.

Изображение ниже приведен пример, который четко показан механизм

Component-IO

+2

Визуализация замечательная, но код также должен быть добавлен как текст к вопросу, так как он может быть доступен для поиска и копирования. –

+0

Теперь у вас есть три тесно связанных компонента. Так себе. –

7

рядом решений с использованием @Input/@Output и родительский компонент в качестве «моста», общий способ будет также вводя общий сервис. Служба должна быть предоставлена ​​в родительском компоненте, чтобы дети могли совместно использовать один экземпляр службы (How do I create a singleton service in Angular 2?).

Базовый пример с использованием BehaviorSubject as a delegate:

@Injectable() 
export class SharedService { 

    messageSource: BehaviorSubject<string> = new BehaviorSubject(''); 

    constructor() { } 
} 

Детский компонент 1:

export class ChildComponent1 { 

    constructor(private _sharedService: SharedService) { } 

    sendMessage(): void { 
     this._sharedService.messageSource.next('Hello from child 1!'); 
    } 
} 

Детский компонент 2:

export class ChildComponent2 { 

    constructor(private _sharedService: SharedService) { 
     this._sharedService.messageSource.subscribe((message: string) => { 
      console.log('Message: ', message); // => Hello from child 1! 
     }); 
    } 
} 

Смотрите этот пост, а также: Angular2 - Interaction between components using a service

5

Вы можете использовать переменные шаблона для ссылки на братьев и сестер:

<child1 #child1></child1> 
<child2 (someOutput)="child1.doSomething($event)"></child2> 
+0

Это то, что я искал, но я не могу бороться с этой ошибкой: нет директивы с «exportAs», установленной в «# child1». Не могли бы вы мне помочь. –

+0

Тогда у вас есть, вероятно, другой код. Возможно, некоторые '=' рядом с '# child'? –

+0

OMG ... Pug conversion 'search-form (#search)' to ''))) –

Смежные вопросы