Функция фильтрации данных Firebase с Angular 8

#angular #typescript #firebase

#angular #typescript #firebase

Вопрос:

Я хочу применить фильтр к заголовкам моих сохраненных данных, но структура моих отфильтрованных данных после фильтрации не совпадает. «Ключ» моих данных удаляется фильтром и заменяется индексом.

Ссылка на репозиторий: https://github.com/Mobize/BlocNote/blob/fdb5a4e60a0094cb0d5cc80e80a3e3ffcf9347ae/src/app/single-section/single-section.component.ts#L88

Вот моя структура базы данных: Структура базы данных

Мои элементы перед фильтрацией: Перед фильтрацией

После фильтрации: После фильтрации

Мой код компонента:

 filter(query: string) {
    this.filteredItems = (query) ?
    Object.values(this.items).filter(p=>p.title.normalize("NFD").replace(/[u0300-u036f]/g, "")
    .toLowerCase().includes(query.toLowerCase())) :
    this.items; 
}
  

Мой шаблон:

 <input #query (keyup)="filter(query.value)" type="text" class="form-control search" placeholder="Recherche...">
<mat-list-item id="item_list" *ngFor="let item of filteredItems | keyvalue ; let i = index" [class.changeColor]="item.key == selectedValue">
  <a (click)="openItem(item, item.key)" *ngIf="item.value.title" matLine><mat-icon [class.yellow]="item.key == selectedValue">code</mat-icon>{{item.value.title}}</a>
  <button mat-icon-button>
    <mat-icon id="edit_item_icon" (click)="onEditItem(item)">edit</mat-icon>
    <mat-icon (click)="openDialog(item.key, item.value.title)">delete_sweep</mat-icon>
 </button>
</mat-list-item>
  

поэтому, когда я нажимаю на элемент, чтобы отредактировать его после фильтрации, он создает новый элемент….

Ответ №1:

Просмотрите ее и отфильтруйте с помощью indexOf() :

 filter(query: string) {
    const result: object = {};

    for (let key in this.items) {
      const data = this.items[key];

      if (this.items.hasOwnProperty(key) amp;amp; data.title amp;amp;
        data.title.normalize("NFD").replace(/[u0300-u036f]/g, "").indexOf(query) !== -1) {
        result[key] = data;
      }
    }

    this.filteredItems = Object.keys(result).length ? result : this.items;
}
  

Я настоятельно рекомендую вам перенести this.filteredItems назначение в ngZone.run() , если вы используете в dom:

 this.ngZone.run(() => {
      this.filteredItems = Object.keys(result).length ? result : this.items;
});
  

Не забудьте импортировать службу в свой конструктор с constructor(private ngZone: NgZone)