Angular 4 - привязка событий от родительского к дочернему компоненту

это мой html-шаблон для родительского компонента. пользовательский тег должен включать мой дочерний компонент для отображения почтовых объектов. У меня подключен экспресс-сервер, и все запросы выполняются через HTTP со службой. Каждый раз, когда я добавляю новый объект сообщения, пользовательский интерфейс не обновляется.

Я понимаю, что мне нужно передать событие дочернему компоненту, но у меня пока не получилось.

/* app.component.html */ в этом шаблоне я пытаюсь связать методы с (onAdded)="onAdded($event)"

<div class="collapse navbar-collapse" id="navbarSupportedContent">

    <ul class="navbar-nav mr-auto links">   
      <li class="nav-item">
        <a class="btn btn-secondary" routerLink="/posts" href="javascript:void(0);" (click)="addToBoard()"> <i class="fa fa-plus-square fa-3x" aria-hidden="true"></i></a>
      </li>
    </ul>

  </div>

</div>

/* app.component.ts (РОДИТЕЛЬ)*/

import { Component, OnInit, **EventEmitter, Output**} from '@angular/core';
import { Post } from './shared/post';
import { PostService } from './services/post.service';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css'],
  providers: [PostService]
})
export class AppComponent implements OnInit  {
  @Output() onAdded = new EventEmitter<Post>();
  title = 'Post it Board';
  posts: Post[];
  private newPost :Post;
  constructor(private postService: PostService) { }

  ngOnInit(): void {
    this.getPosts()
    this.newPost = {
      text: 'some text',
      _id: ''

    }
  }


  addToBoard(): void {
    this.postService.addPost(this.newPost).subscribe(
      response=> {
          if(response.success== true)
             //If success, update the view-list component
             console.log('success')
             **this.onAdded.emit(this.newPost);**
      },
   );
  }

  getPosts() {
    this.postService.getAllPosts().subscribe(
        response => this.posts = response,)   
  }

}

/view-board.component.ts (ДЕТСКИЙ)/

import { Component, OnInit} from '@angular/core';
import { Post } from '../shared/post';
import { POSTS } from '../shared/mock-posts';
import { PostService } from '../services/post.service';

@Component({
  selector: 'view-board',
  templateUrl: './view-board.component.html',
  styleUrls: ['../css/style.css'],
  providers: [PostService]
})
export class ViewBoardComponent implements OnInit {

  title = "Post it"
  posts: Post[];
  constructor(private postService: PostService) { }

  ngOnInit() {
    this.getPosts()
  }

  getPosts() {
    this.postService.getAllPosts().subscribe(
        response => this.posts = response,)   
  }

  **onAdded(post: Post) {
    console.log('new post added ' + post.text)
    this.posts = this.posts.concat(post);
  }**

}

Спасибо за вашу помощь!


person Community    schedule 21.09.2017    source источник
comment
Извините, я понял, что часть кода отсутствует   -  person    schedule 21.09.2017
comment
‹view-board (onAdded)=onAdded($event)›‹/view-board›, я делаю привязку события в app.component.html   -  person    schedule 21.09.2017


Ответы (1)


Нет, вам нужно выполнить событие Emitting, если вы хотите перейти от дочернего элемента к родительскому, в этом случае вы можете просто передать его в качестве ввода дочернему элементу.

Внутри родительского компонента.

<view-board [success]="success">

и в вашем дочернем компоненте,

@Input() success: string;
person Sajeetharan    schedule 21.09.2017