Я использую Angular7, NgBootstrap 4. У меня есть поле ввода с директивой Typeahead.
Когда я следую формату пользовательской функции поиска, как написано в документации, работает нормально. Когда я пытаюсь изменить формат, я получаю сообщение об ошибке:
Я получаю такую ошибку:
core.js:12584 ERROR TypeError: Cannot set property 'searching' of undefined
Что я делаю не так?
Это работает:
search = (text$: Observable<string>) =>
text$.pipe(
debounceTime(300),
distinctUntilChanged(),
tap(() => this.searching = true),
switchMap(term =>
this.searchService.fetchData(term).pipe(
tap(() => this.searchFailed = false),
catchError(() => {
this.searchFailed = true;
return of([]);
}))
),
tap(() => this.searching = false)
);
Это не работает:
search = function (text$: Observable<string>) {
return text$.pipe(
debounceTime(300),
distinctUntilChanged(),
tap(() => this.searching = true),
switchMap(term =>
this.searchService.fetchData(term).pipe(
tap(() => this.searchFailed = false),
catchError(() => {
this.searchFailed = true;
return of([]);
}))
),
tap(() => this.searching = false)
);
}
Вы используете функции без стрелок, которые не привязаны к this. Просто используйте стрелочные функции, как показывают примеры.
Спасибо. Причина, по которой я использую функцию без стрелок, заключается в том, что я хочу добавить вызовы пользовательских функций до того, как будет возвращен текст $ .pipe .., однако ваш ответ дал мне правильное направление. Спасибо!





Спасибо Дж. Б. Низету, который указал мне правильное направление. Это рабочий код (см. Фигурные скобки в первой и последней строке)
search = (text$: Observable<string>) => {
// do some logic before text$.pipe call
console.info(text$);
text$.pipe(
debounceTime(300),
distinctUntilChanged(),
tap(() => this.searching = true),
switchMap(term =>
this.searchService.fetchData(term).pipe(
tap(() => this.searchFailed = false),
catchError(() => {
this.searchFailed = true;
return of([]);
}))
),
tap(() => this.searching = false)
);
}
Возможный дубликат Как получить доступ к правильному `this` внутри обратного вызова?