2016-06-02 4 views
1

У меня есть компонент Angular2, который должен получить идентификатор из внешней службы. Эта услуга возвращает обещание, поэтому мне нужно дождаться обещания, чтобы вернуть данные, прежде чем продолжить. Компонент выглядит примерно так:Promises, Angular2 и scope

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: Error: Uncaught (in promise): TypeError: Cannot set property 'id' of undefined

служба просто возвращает Promise.resolve(data) с деталями мне нужно , и я проверил, что возвращает данные, как ожидалось. Однако теперь кажется, что внутри «thennable» обещания я больше не могу получить доступ к this.todo, предположительно потому, что теперь это относится к обещанию, а не к классу.

Какое правильное/предпочтительное средство решения этой проблемы?

+0

Это javascript? –

+0

Да, добро пожаловать в новый мир Angular2, ES6 и обещаю с окроплением машинописного текста :) – LDJ

ответ

3

Проблема не связана со значением this - она ​​по-прежнему относится к экземпляру класса AddTodoComponent благодаря использованию функций «жирная стрелка» (=>).

Вместо этого проблема заключается в том, что нет item объекта this.todo, вместо этого вы не можете установить this.todo.item.id.

3

Поскольку todo является элемент

this.todo = new TodoItem(); 

this.todo.item(свойство item экземпляра TodoItem) ... не определено. Таким образом, следует инициализировать первую (во всяком случае, внутри конструктора, или снаружи, как ниже)

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

ошибка не указывает на this не указывает на текущий экземпляр AddTodoComponent, но вместо этого item из this.todo является не определено. Ошибка, как представляется, в new TodoItem() не для определения item.