承诺,Angular2和范围

时间:2016-06-02 05:51:53

标签: javascript typescript angular promise

我有一个Angular2组件需要从外部服务获取ID。此服务返回一个promise,因此我需要等待Promise在继续之前获取数据。该组件看起来像这样:

export class AddTodoComponent implements OnInit {
    public todo:TodoItem;
    constructor(private todoService: TodoService,
                private router: Router) {
        this.todo = new TodoItem();
     }


    saveItem(){
        this.todoService.getItems().then(t=>{
            this.todo.item.id = t.length;
            this.todoService.addItem(this.todo);
        });

    }
}

但是,当saveItem函数执行时,我在控制台中收到错误,如下所示:

  

EXCEPTION:错误:未捕获(在承诺中):TypeError:无法设置   财产' id'未定义的

该服务只返回Promise.resolve(data)包含我需要的项目,并且我已经验证了按预期返回数据。但是,现在似乎在承诺的' thennable '中我无法再访问this.todo,因为现在它指的是承诺而不是类。

解决此问题的正确/首选方法是什么?

3 个答案:

答案 0 :(得分:3)

因为todo

this.todo = new TodoItem();

this.todo.item item实例的属性TodoItem ...未定义。所以,它应该是init (无论如何,在构造函数内部,或者在下面如下)

this.todo.item=  this.todo.item || {} ; // just init item
this.todo.item.id = t.length;

答案 1 :(得分:3)

问题与this的值无关 - 由于使用了"胖箭头"它仍然引用AddTodoComponent类实例。函数(=>)。

相反,问题似乎是item没有this.todo属性,因此您无法设置this.todo.item.id

答案 2 :(得分:2)

该错误并未表示this未指向AddTodoComponent的当前实例,而是item的{​​{1}}未定义。该错误似乎在this.todo中,未定义new TodoItem()