首页 文章

承诺,Angular2和范围

提问于
浏览
1

我有一个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:无法设置undefined的属性“id”

该服务只返回带有我需要的项目的 Promise.resolve(data) ,并且我已经验证了正在按预期返回数据 . 然而,现在似乎在承诺的'thennable'里面我再也无法访问 this.todo ,因为这现在指的是承诺而不是类 .

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

3 回答

  • 3

    问题与 this 的值无关 - 由于使用了"fat arrow"函数( => ),它仍然引用了 AddTodoComponent 类实例 .

    相反,问题似乎是 this.todo 没有 item 属性,所以你不能再设置 this.todo.item.id .

  • 2

    因为 todoitem

    this.todo = new TodoItem();
    

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

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

    该错误并不表示 this 未指向 AddTodoComponent 的当前实例,而是 itemitem 未定义 . 该错误似乎在 new TodoItem() 中没有定义 item .

相关问题