У меня проблемы с пониманием и получением чего-то для работы с RxJS Observables и ngrx Store.
Я пробовал combineLatest
, фильтры, объединение массивов и т. Д., Но, похоже, не могу найти работающее безошибочное решение.
Буду признателен за любые комментарии / отзывы о том, какие методы лучше всего подходят для достижения этого результата
Требование
- Возьмите 2 объекта из магазина ngrx и отфильтруйте первый объект по
недвижимость во втором объекте
- Люди - 1-й объект Список людей
- Компании - 2-й объект Список компаний
- PeopleFromSelectedCompanies - Фильтр 1-го объекта, чтобы показать только
люди, которые соответствуют идентификаторам компании во втором объекте d. Если нет
во втором объекте существуют компании, тогда я хочу показать всех людей из первого объекта
- Назначение PeopleFromSelectedCompanies источнику данных для углового материала DataTable
- Принять строковый фильтр для фильтрации PeopleFromSelectedCompanies для любых свойств, содержащих строку
Весь код ngOnInit
работает нормально. Я получаю доступ ко всем необходимым спискам, и каждый раз, когда я выбираю другого клиента, запускается getSelectedCustomersPeople
.
Текущий код спагетти ? если вы понимаете, что я пытаюсь сделать
Компонент
ngOnInit() {
this.peopleStore.dispatch(new fromPeopleStore.LoadPeople());
this.people$ = this.peopleStore.select(fromPeopleStore.getAllPeople);
this.selectedCustomers$ = this.toolbarStore
.select(fromToolbarStore.getSelectedCustomers);
this.selectedCustomers$.subscribe(selected => {
this.selectedCustomersPeople$ = this.getSelectedCustomersPeople();
});
}
getSelectedCustomersPeople(): Observable<Person[]> {
return combineLatest(this.selectedCustomers$, this.people$, (customers, people) => {
const allSelectedPeople = customers.map(
customer => Object.assign(people.filter(
person => person.company === customer.id
))
);
const flattenSelectedPeople = [].concat.apply([], allSelectedPeople);
return flattenSelectedPeople;
});
}
applyFilter(filterValue = ' ') {
filterValue = filterValue.trim();
filterValue = filterValue.toLowerCase();
this.selectedCustomersPeople$ = filterValue;
// Would like to filter here not sure how
}
Template
<mat-table #table [dataSource]="selectedCustomersPeople$ | async"
matSort
[@animateStagger]="{ value: '50' }">
<!-- Name Column -->
<ng-container cdkColumnDef="firstName">
<mat-header-cell *cdkHeaderCellDef mat-sort-header>First Name</mat-header-cell>
<mat-cell *cdkCellDef="let person">
<p class="text-truncate font-weight-600">
{{ person.firstName }} {{ person.familyName }}
</p>
</mat-cell>
</ng-container>
<mat-header-row *cdkHeaderRowDef="displayedColumns"></mat-header-row>
<mat-row *cdkRowDef="let person; columns: displayedColumns;"
class="person"
(click)="editPerson(person)"
[ngClass]="{'mat-light-blue-50-bg': checkboxes[person.id]}"
matRipple
[@animate]="{ value: '*', params: { y: '100%' } }">
</mat-row>
</mat-table>