не работает излучатель события материала angular6 - PullRequest
0 голосов
/ 05 сентября 2018

Я пытаюсь реализовать Event Emitter таким образом, чтобы при добавлении задачи в базу данных она добавлялась в список задач. Но это не работает. Пожалуйста, найдите код ниже: Компонент todoinput (todo.input.html): компонент, который добавляет задачу в базу данных

import { Component, OnInit, EventEmitter, Output } from '@angular/core';
import { Todos } from '../../models/Todos';
import { TodosService } from '../../services/todos.service';

@Component({
  selector: 'app-todoinput',
  templateUrl: './todoinput.component.html',
  styleUrls: ['./todoinput.component.css']
})
export class TodoinputComponent implements OnInit {

  @Output() newTodo: EventEmitter<Todos> = new EventEmitter();

  constructor(private _todosService: TodosService) { }

  ngOnInit() {

  }

  addTodo(text) {
    this._todosService.addTodo({
      text: text,
    }).subscribe((todo) => {
      this.newTodo.emit(todo);
    })
  }

}

app.component.html: содержит все компоненты.

<app-navbar></app-navbar>
<app-todoinput (newTodo)="onNewTodo($event)">
</app-todoinput>
<app-todolist>
</app-todolist>

todolist.component.ts: который добавляет список задач в список задач

import { Component, OnInit } from '@angular/core';
import { Todos } from '../../models/Todos';
import { TodosService } from '../../services/todos.service';

@Component({
  selector: 'app-todolist',
  templateUrl: './todolist.component.html',
  styleUrls: ['./todolist.component.css']
})
export class TodolistComponent implements OnInit {

  todos: Todos[]

  constructor(private _todosService: TodosService) {
  }

  ngOnInit() {
    this._todosService.getTodos().subscribe((todos) => {
      this.todos = todos;
    })
  }

  onNewTodo(todo: Todos) {
    console.log('-- the passed todo --', todo);
    this.todos.unshift(todo);
  }
}

Он пытается испустить newTodo, когда tod добавляется в db. Но выдает ошибку ниже:

AppComponent.html:2 ERROR TypeError: _co.onNewTodo is not a function
    at Object.eval [as handleEvent] (AppComponent.html:2)
    at handleEvent (core.js:10258)
    at callWithDebugContext (core.js:11351)
    at Object.debugHandleEvent [as handleEvent] (core.js:11054)
    at dispatchEvent (core.js:7717)

Это похоже на правильную реализацию. Может ли кто-нибудь дать мне знать, что я делаю не так? Разве это не работает с Event Emitter?

Спасибо

1 Ответ

0 голосов
/ 05 сентября 2018

Согласно вашему примеру, вы определили этот шаблон <app-todoinput (newTodo)="onNewTodo($event)"> в HTML-коде AppComponent. В то время как ваш onNewTodo($event) является частью todolist.component.ts. Таким образом, ошибка.

Вместо этого вам следует сделать следующее: поскольку вы хотите изменить данные между двумя одноуровневыми компонентами, вам следует реализовать службу с BehaviorSubject вместо свойства Output в дочернем компоненте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...