Angular2, дочерний вывод не выводится на родительский

#templates #angular #output #components

#шаблоны #angular #вывод #Компоненты

Вопрос:

У меня есть два компонента, один дочерний по отношению к другому. У меня есть функция click, которая заставляет отправитель события в этом компоненте выдавать строку. В родительском шаблоне в дочернем теге у меня есть источник событий, запускающий функцию в родительском компоненте, которая просто регистрирует простое сообщение на консоли. Я могу видеть, регистрируя переменную источника события в консоли, что функция click в дочернем элементе работает, но я не могу понять, почему она не выводится корректно до родительского элемента.

Дочерний компонент

 import {Component, OnInit, EventEmitter} from 'angular2/core';

@Component({
    selector: 'team-bubbles',
    templateUrl: '/static/partials/team/team-bubbles.html',
    outputs: ['sendTeamDataUp'],
})

export class TeamBubblesComponent {
    sendTeamDataUp:EventEmitter<string>;

    constructor() {
        this.sendTeamDataUp = new EventEmitter();
    };

    invokeTeamDataEmitter() {
        console.log('Made it this far');
        this.sendTeamDataUp.emit('WAKA WAKA WAKA');
    }

    OnInit() {
        console.log('TEAM BUBBLE WORKS');
    }
}
  

team-bubbles.html

 <div class="bubble-wrapper sm" id="bubble-1" (click)="invokeTeamDataEmitter()">
        <div class="team-bubble sm">
            <img src="/static/images/team/guy1.jpg" alt="guy 1">
        </div>
    </div>
  

Родительский компонент

 import {Component} from 'angular2/core';
import {TeamBubblesComponent} from "./teambubbles.component";
import {TeamInfoComponent} from "./team-info.component";

@Component({
    selector: 'team',
    templateUrl: '/static/partials/team/team.html'
})

export class TeamComponent {

    receiveData(){
        console.log('Output Works');
    }
}
  

team.html

 <div class="full-wrapper team-bubbles-container">
    <div class="container">
        <div class="row">
            <team-bubbles (sendTeamDataUp)="receiveData($event)"></team-bubbles>
        </div>
    </div>
</div>
<div class="full-wrapper member-bio-container">
    <div class="container" style="padding: 5px;">
        <div class="row">
            <team-info></team-info>
        </div>
    </div>
</div>
  

Комментарии:

1. У меня это работает. Можете ли вы воспроизвести это в plunker?

2. Кажется, вы используете старую версию angular2. Вы должны добавить свой дочерний компонент в directives массив вашего родительского компонента plnkr.co/edit/1vYZFhnPyePiWwWBYgPs?p=preview

3. позвольте мне попробовать. Должен ли я обновить свою версию Angular2?

4. Да, это исправлено! Я думал, что, просто импортируя компоненты в родительский, это сработает, поскольку приложение находило селекторы дочернего компонента и отображало их шаблоны. Спасибо Yurzui!

Ответ №1:

     sendTeamDataUp:EventEmitter<string>;

    constructor() {
        this.sendTeamDataUp = new EventEmitter<string>();           //<<<### added <string>
    };

    invokeTeamDataEmitter() {
        console.log('Made it this far');
        this.sendTeamDataUp.emit('WAKA WAKA WAKA');
    }
  

или

     sendTeamDataUp:EventEmitter<string>=new EventEmitter<string>(); //<<<### declare here

    invokeTeamDataEmitter() {
        console.log('Made it this far');
        this.sendTeamDataUp.emit('WAKA WAKA WAKA');
    }
  

Комментарии:

1. Спасибо, но ни одно из этих изменений не сработало для меня. В typescript не будет ли просто по умолчанию использоваться тип ‘any’, если тип не указан?

2. можете ли вы удалить outputs: ['sendTeamDataUp'], и использовать его как @Output() sendTeamDataUp:EventEmitter<string>=new EventEmitter<string>();

3. с помощью декоратора вывода вместо поля компонента outputs он, к сожалению, по-прежнему не выводится на родительский :/