列表组件
import { Component, OnInit } from '@angular/core';
import { Todo } from '../model/todo';
import { TodoDetailComponent } from './detail.component';
import { TodoService } from '../service/todo.service';
@Component({
selector: 'my-todos',
styleUrls: ['/app/todo/styles/list.css'],
templateUrl:'/app/todo/templates/list.html',
directives: [[TodoDetailComponent]],
providers: []
})
export class ListComponent implements OnInit {
public todos: Todo[];
title = 'List of Todos';
selectedTodo: Todo;
newTodo: string;
constructor(private todoService: TodoService) {
}
ngOnInit() {
this.getTodos();
}
addTodo() {
this.todoService.addTodo(this.newTodo).then(
todos => this.todos = todos
);
}
getTodos() {
TodoService.getTodos().then(
todos => this.todos = todos
);
}
onSelect(todo: Todo) {
this.selectedTodo = todo;
}
}
待办事项服务
import { Injectable } from '@angular/core';
import { Todo } from '../model/todo';
import { TODOS } from './mock-todos';
@Injectable()
export class TodoService {
static getTodos() {
return Promise.resolve(TODOS).then(
todos => todos
);
}
getTodo(id: number) {
return Promise.resolve(TODOS).then(
todos => todos.filter(todo => todo.id === id)[0]
);
}
addTodo(task: string) {
return Promise.resolve(TODOS).then(
todos => todos.push(new Todo(TODOS.length+1, task))
);
}
}
从组件调用
addTodo()
时出现此错误:我已经经历过好几次了,仍然不知道发生了什么。
以下是
TODOS
的定义:import { Todo } from '../model/todo';
export var TODOS: Todo[] = [
{ id: 1, task: 'Do something' },
{ id: 2, task: 'Do something else' }
];
我有一个按钮触发模板中的
addTodo()
。 最佳答案
Angular在列表更改其值时使用diffchecker-以验证列表中包含的项以及添加到列表中的项。
发生此错误的原因可能是您试图遍历(例如使用*ngFor
)不是集合的数字3
。
换句话说,从错误消息中,应该是集合的变量是值3
。
你的案子
因为在调用ListComponent#addTodo()
时会引发异常:
public todos: Todo[];
...
addTodo() {
this.todoService.addTodo(this.newTodo).then(
todos => this.todos = todos
);
}
您可能正在将值
3
分配给this.todos
attodos => this.todos = todos
。了解上述情况后,我们必须找出为什么您的服务会因调用其
3
而返回addTodo()
。看看
TodoService#addTodo()
:addTodo(task: string) {
return Promise.resolve(TODOS).then(
todos => todos.push(new Todo(TODOS.length+1, task))
);
}
您会注意到,该方法实际上返回的是
push()
-的结果,这是推送之后数组的长度。由于它向TODOS
模拟数组添加了一个元素,因此在推送之后它将有三个元素,从而返回3
。修复
要使其全部工作,请将集合分配给
*ngFor
中使用的变量,而不是数字3
。在您的例子中,由于分配给它的值是服务返回的值,所以只需让它返回数组:
addTodo(task: string) {
return Promise.resolve(TODOS).then(
todos => {
todos.push(new Todo(TODOS.length+1, task));
return todos; /// ------------- added this line
}
);
}