【发布时间】:2018-10-15 02:49:01
【问题描述】:
当我的 EventEmitter 发出事件时,我的 Angular SPA 不会刷新。
这是我在子组件中的EventEmitter:
import { Component, OnInit, Output, EventEmitter } from '@angular/core';
import { Todo } from '../todo';
@Component({
selector: 'app-add-todo',
templateUrl: './add-todo.component.html',
styleUrls: ['./add-todo.component.css']
})
export class AddTodoComponent implements OnInit {
newTodo: Todo = new Todo();
@Output() addTodoEvent: EventEmitter<Todo> = new EventEmitter();
constructor() { }
addTodo() {
this.addTodoEvent.emit(this.newTodo);
console.log('event emitted');
this.newTodo = new Todo();
console.log('new todo created');
}
ngOnInit() {
}
}
这是使用它的模板:
<div class="container">
<app-add-todo (addTodoEvent)='onAddTodo($event)'></app-add-todo>
// other template stuff
</div>
这是onAddTodo的声明:
onAddTodo(todo: Todo) {
console.log('onAddTodo called');
this.todoDataService.addTodo(todo);
}
基本上,应用程序可以工作,但我必须在进行任何更改后按 F5 来刷新页面。
需要注意的一点是,这曾经在我使用数组作为数据源时起作用,但是当我转到 json-server 和 Observables 时,页面停止刷新。
我很乐意提供任何可能需要的进一步信息。
更新:
这里是addTodo:
addTodo(todo: Todo): void {
this.aHttpService.post<Todo>(`http://localhost:3000/todos`, todo).subscribe(
val => {
console.log('POST call successful value returned in body', val);
},
response => {
console.log('POST call in error', response);
},
() => {
console.log('The POST observable is now completed.');
}
);
}
列出待办事项的完整代码如下:
import { Component, OnInit } from '@angular/core';
import { Todo } from '../todo';
import { TodoDataService } from '../todo-data.service';
import { Observable } from 'rxjs/Observable';
@Component({
selector: 'app-todo-list',
templateUrl: './todo-list.component.html',
styleUrls: ['./todo-list.component.css']
})
export class TodoListComponent implements OnInit {
constructor(private todoDataService: TodoDataService) {}
completetodos: Observable<Array<Todo>>;
incompletetodos: Observable<Array<Todo>>;
onAddTodo(todo: Todo) {
console.log('onAddTodo called');
this.todoDataService.addTodo(todo);
}
toggleTodoComplete(todo) {
this.todoDataService.toggleTodoComplete(todo);
}
removeTodo(todo) {
this.todoDataService.deleteTodoById(todo.id);
}
editTodo(todo: Todo) {
todo.editMode = true;
}
updateTodo(todo: Todo, editInput) {
todo.title = editInput.value;
todo.editMode = false;
this.todoDataService.updateTodoById(todo.id, todo);
}
allTasks(): Observable<Array<Todo>> {
return this.todoDataService.getAllTodos();
}
completedTodos(): Observable<Array<Todo>> {
return this.todoDataService.completedTodos();
}
incompletedToDos(): Observable<Array<Todo>> {
return this.todoDataService.incompletedTodos();
}
ngOnInit() {
this.completetodos = this.completedTodos();
this.incompletetodos = this.incompletedToDos();
}
}
【问题讨论】:
-
addTodo 正在执行 Http 调用?
-
@AlexanderStaroselsky -- 添加了我的
addToDo电话。 -
用这样的零碎的sn-ps代码和明显的拼写错误有点难以弄清楚(你有一个名为'addTodoEvent'的EventEmitter,但调用了'add.emit')。一个完整的运行示例,也许在 stackblitz.com 上会有很大帮助。
-
您需要澄清您希望在 post() 之后在屏幕上更新的内容。您是在发布成功后将新的 Todo 推送到数组中,还是在视图中显示任何内容?
-
@NickHodges 你能把你的代码贴在列出待办事项的地方吗?
标签: angular typescript eventemitter