У меня есть два компонента details
и details-view
.
В details
я должен передать наблюдаемое @Input()
во второй компонент.
Детали Компонент
res$: (id: number, type: string) => Observable<DetailsResponse[]>;
constructor(private service: Service) {
this.res$ = service.getData;
}
Оказание услуг
getData(id: number, type: string): Observable<DetailsResponse[]>{
const params = new HttpParams().append('typename', type);
return this.http.get<any>('api/id', {params: params});
}
Детали-Просмотр HTML
<dwtalis-view [resources$] = "res$"></dwtalis-view>
Детали-Виев ТП Компонент
@Input()
resouces$: Observable<DetailsResponse[]>
Мой вопрос заключается в том, как подписаться и получить данные из resources$
, наблюдаемые в компоненте просмотра деталей. Подписка на этот объект возвращает ошибку "resources$ не является функцией, подписка на которую невозможна"
как сказал Влад, вы передаете функцию вместо наблюдаемой. В вашем случае вам нужно вызвать эту функцию resources$(), чтобы получить от нее наблюдаемое. ресурсы$().подписаться.
Вы можете изменить DetailsViewComponent
как следующий код
export class DetailsViewComponent implements OnInit, OnChanges {
@Input() resouces$: (id: number, type: string) => Observable<DetailsResponse[]>;
constructor(
) {}
ngOnInit() {
}
ngOnChanges(data) {
if (data.resouces$ && this.resouces$) {
this.resouces$(this.id, this.type).subscibe(res => {});
}
}
}
Аргументы для getData()
известны во втором компоненте, поэтому он не работает.
Определены ли id
и type
при создании DetailsViewComponent?
Да ,,,,,,,,,,,,
Помимо опечатки в service.getData()
, также важно знать, когда входные свойства доступны для привязки. Входные данные не устанавливаются в конструкторе, они доступны в хуке жизненного цикла ngOnChanges
каждый раз при изменении входных данных. или в ngOnInit
, если вы хотите привязать только в первый раз, когда он получен.
Типография не совпадает. res$
— функция (id: number, type: string) => Observable<DetailsResponse[]>
, но resouces$
— наблюдаемая Observable<DetailsResponse[]>
;
Судя по вашим комментариям, вам нужно передать функцию, потому что аргументы недоступны в родительском компоненте. Итак, вам нужно принять функцию как @Input
, а затем выполнить ее в дочернем компоненте.
Дочерний компонент
@Input()
resouces$: (id: number, type: string) => Observable<DetailsResponse[]>;
// Use ngOnInit since @Input properties are populated at this time
ngOnInit() {
// Example arguments
this.resouces$(this.id, this.type).subscribe(results => {
// Do whatever you need to do with the results
console.info(results);
})
}
Предполагая, что это не опечатка:
this.res$ = service.getData
просто передает определение функции. Если вам действительно нужна наблюдаемая, вам нужно выполнить функциюthis.res$ = service.getData()
. В качестве альтернативы, если вы действительно хотите передать определение функции, то ваш ввод дляresource$
неверен, и он должен(id: number, type: string) => Observable<DetailsResponse[]>
соответствоватьres$
из родительского компонента.