это не работает из-за того, как угловые трассы изменяют обнаружение.Он постоянно повторяет эту функцию getObservable () снова и снова и отменяет / повторную подписку, поэтому фактически никогда не достигает этого тайм-аута 1000 мс.
сделайте это вместо:
observable$;
constructor() {
this.observable$ = this.getObservable();
}
и передайте наблюдаемый $ компоненту.Эта функция обнаружения изменений также является причиной того, что вы вообще никогда не должны помещать вызовы функций в шаблоны.это риск для производительности.
Есть много способов сделать это, но обычно вам нужно убедиться, что ваше наблюдаемое назначение выполняется только один раз, и это не произойдет при вызове функции шаблона.
основываясь на ваших изменениях, вы бы сделали это следующим образом:
constructor() {
this.hellos = this.hellos.map(hello =>
Object.assign(hello, {observable$: this.getObservable(hello)});
}
<hello *ngFor="let hi of hellos" [name]="hi.observable$"></hello>
вы могли бы также придумать какую-то систему передачи функции и ее аргументов дочернему элементу:
export class HelloComponent implements OnInit {
@Input() param: any;
@Input() fn$: (param: any) => Observable<string>;
name: Observable<string>;
ngOnInit() {
this.name = this.fn$(this.param);
}
}
в родительском шаблоне:
<hello *ngFor="let hi of hellos" [fn$]="getObservable" [param]="hi"></hello>
имейте в виду, что это может вызвать проблемы, если ваша функция использует внедренные сервисы, и вам необходимо связать контекст.