Как получить конкретные значения из списка объектов внутри наблюдаемого в шаблон в угловой

#angular #rxjs #observable

#угловой #rxjs #наблюдаемый

Вопрос:

Я столкнулся с этой проблемой. У меня есть интерфейс, в котором есть два поля, используемые для поиска

 export interface searchClass {   text: string;   id: number; }  

Я использую этот интерфейс в своем компоненте, который определен следующим образом

 searchClass$: Observablelt;searchClass[]gt; = new Observable();    

и к нему привязаны значения из api.

 this.searchClass$ = this.getSearchClass();  

Моя проблема в том, что в html-шаблоне я хочу отображать только текст и привязывать только один массив значений полей, но затем, когда компонент активируется, я хочу иметь идентификаторы этих текстовых полей. Как этого добиться?

Я пытался сделать что-то вроде этого,

 lt;div *ngIf="(searchClass$ | async)?.text as myValues"gt;  lt;myComponent   [values] = myValuesgt;  (output) = setIds($event)gt;  lt;/myComponentgt; lt;/divgt;  

но из этого ничего не вышло, потому [values] что так и не было назначено. Я придумал, просто создав 2 наблюдаемых объекта, по одному для обоих полей и один только для текста, вот так

 this.getSearchClass().subscribe(data =gt; {  this.searchClass$ = new Observable((subscriber) =gt; {  subscriber.next(data);  subscriber.complete();  });  const names = data.map(element =gt; element.text);  this.searchText$ = new Observablelt;string[]gt;(subscriber =gt; {  subscriber.next(names);  subscriber.complete();  });  

тогда просто создайте html-шаблон, подобный этому

 lt;divgt;  lt;myComponent   [values] = "searchText$ | async"  (output) = setIds($event)gt;  lt;/myComponentgt; lt;/divgt;  

И управляйте выходным массивом таким образом, чтобы назначать идентификаторы выделенного текста

 setIds(text: string[]) {  this.searchClass$.subscribe(search =gt; {  someOtherField = search  .filter(element =gt; text.includes(element.text))  .map(element =gt; element.id);  

Но я думаю, что это неэффективно, и должен быть способ сделать это без создания 2 наблюдаемых объектов.

Комментарии:

1. В вашем коде очень много синтаксических ошибок, например lt;div *ngIf="(searchClass$ | async)?.text as myValues"gt; , он не будет компилироваться… Пожалуйста, предоставьте код, который на самом деле компилируется, чтобы продемонстрировать вашу проблему.

Ответ №1:

Попробуйте это:

 lt;div *ngIf="searchClass$ | async as myValues"gt;  lt;myComponent   [values] = myValuesgt;  (output) = setIds($event)gt;  lt;/myComponentgt; lt;/divgt;  setIds(myValueSelected: searchClass) {  this.someOtherField = myValueSelected.id; }  

И в вашем компоненте «миКомпонент» у вас должна быть входная переменная, чтобы получить «myValues» и некоторые, чтобы» излучать » выбранное значение, и логика выбора, что-то вроде:

 @Input()  values!: searchClass;  @Output() output: EventEmitterlt;searchClassgt; = new EventEmitter();  // Some treatment in your myComponent // When you get the select searchClass, you have to emit it.  // For instance (just as an example if you finally selected the first Class of values): const mySelectSearchClass = values[0];  this.output.emit(mySelectSearchClass);   

Комментарии:

1. Проблема в том, что я не могу изменить «миКомпонент».