Ionic 4, база данных и панель поиска

#firebase #ionic-framework #ionic4 #searchbar

#firebase #ionic-фреймворк #ionic4 #панель поиска

Вопрос:

Мне нужна помощь в использовании панели поиска для поиска имен из Firebase. Я успешно смог перечислить все имена из Firebase, но у меня возникли проблемы с поиском в Firebase определенного имени.

Структура данных Firebase:

 myApplicaton
    infos
      1
       info_name:Name1
      2 
       info_name: Name2
  

home.page.html

 <ion-content>
    <ion-searchbar (ionInput)="getItems($event)"></ion-searchbar>
  <ion-list>
    <ion-item-sliding *ngFor="let info of infos">
      <ion-item detail lines="full" routerLink="/detail/{{info.key}}">
        <ion-icon name="desktop" slot="start"></ion-icon>
        {{info.info_name}}
      </ion-item>
    </ion-item-sliding>
  </ion-list>
</ion-content>
  

home.page.ts- я могу видеть имя, которое я ввожу в панель поиска с помощью console.log.

 export class HomePage {

  infos = [];
  ref = firebase.database().ref('infos/');

  public infosList:Array<any>;
  public loadedInfoList:Array<any>;

  constructor(private route: ActivatedRoute, public router: Router, public alertController: AlertController) {
    this.ref.on('value', resp => {
      this.infos = [];
      this.infos = snapshotToArray(resp);

      this.infosList.forEach(info =>{
        this.infos.push(info.val());
        return false;

      });
    });
    this.infosList = this.infos;
    this.loadedInfoList = this.infos;

  }

  initializeItems(){
    this.infosList = this.loadedInfoList;
  }

   getItems(ev: any) {
    // Reset items back to all of the items
    this.initializeItems();

    // // set q to the value of the searchbar
    // var q = searchbar.srcElement.value;
    let q = ev.target.value;

    // if the value is an empty string don't filter the items
    if (!q) {
      return;
    }

    this.infosList = this.infosList.filter((info) => {
      if(info.info_name amp;amp; q) {
        if (info.info_name.toLowerCase().indexOf(q.toLowerCase()) > -1) {
          return true;
        }
        return false;
      }
    });

    console.log(q, this.infosList.length);

  }
}

export const snapshotToArray = snapshot => {
  let returnArr = [];

  snapshot.forEach(childSnapshot => {
      let item = childSnapshot.val();
      item.key = childSnapshot.key;
      returnArr.push(item);
  });

  return returnArr;
}
  

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

1. в firebase действительно нет хороших способов поиска. Это печальное ограничение. Конечно, есть некоторые вещи, которые вы можете сделать. Но это действительно зависит от того, как структурированы ваши данные.

2. Если вы работаете над продуктом, который отчаянно нуждается в поиске. Возможно, вам придется создать сервер поверх вашей firebase, который использует что-то вроде elasticsearch.

3. @Dylan Я добавил, как структурированы мои данные, любые предложения были бы замечательными.

4. @Dylan Firebase обладает потрясающе быстрыми возможностями запросов и, пока данные денормализованы, также может предоставлять широкий спектр запросов. В этом случае для пользователей будет запрашиваться имя пользователя, которое довольно просто как в базе данных Firebase Realtime, так и в FireStore; что-то вроде var query = ref.orderByChild('info_name').equalTo('Bruce'); Для меня это довольно хороший способ поиска. Это хорошо задокументировано в руководствах для дополнительного чтения.