Ваша проблема в том, что вы не используете функцию стрелки для обратного вызова complete
при вызове subscribe
. Как видите, вы используете функции стрелок для next
и error
.
Когда вы определяете новую функцию с помощью function(...) {...}
, вы создаете новый контекст, и поэтому ключевое слово this
меняет свое значение. Разница между функцией стрелки и обычными функциями (на мой взгляд, помимо того, что она более элегантна) состоит в том, что функции стрелки не определяют новый контекст для this
, и поэтому значение этого ключевого слова такое же, как и в контексте, в котором они находятся. определены. Таким образом, в ваших обратных вызовах next
и error
, this
является вашим компонентом, но в вашем вызове complete
, this
, скорее всего, является ссылкой на window
, которая не имеет items
свойство, следовательно, undefined
.
Измените свой код на:
public items = [];
constructor(private itemService: ItemService) { }
ngOnInit() {
this.itemService.getItems()
.subscribe(
data => this.items = data,
err => console.log(err),
() => {
console.log('selected data', this.items); // this prints undefined
if (this.items && this.items.length) {
this.itemService.selectedItem(this.items[0])
}
});
}
Я полагаю, вы использовали ключевое слово function
, потому что у этой функции не было аргументов, но вы можете выразить это с помощью синтаксиса () => expression
или () => {...}
data => this.items = data
, в конце концов, это более простой и элегантный способ написания
(data) => { return this.items = data; }