Angular 6, как предоставить данные как массив void - PullRequest
0 голосов
/ 30 августа 2018

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

export class AddComponent {
  protected dataService: CompleterData;
  protected searchData = [
    {name: '84A4DA'},
    {name: '846ASD'},
    {name: '8444AS'},
]
constructor(private completerService: CompleterService, private router: Router, public back: BackService,
             ) {
this.dataService = completerService.local(this.searchData, 'name', 'name');
}

Но когда я пытаюсь сделать мои searchData из базы данных db firebase:

getArray(): void {
    this.afDatabase.list('/imones')
      .valueChanges()
      .subscribe(res => {
        console.log(res)//should give you the array of percentage.
        this.array = res;
      })
}

this.searchData = this.back.getArray();
  constructor(private completerService: CompleterService, private router: Router, public back: BackService,
             ) {
    this.dataService = completerService.local(this.searchData, 'name', 'name');
}

Я получаю ошибку:

enter image description here

Как это исправить?

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Проблема в том, что в конструкторе this.SearchData НЕ является массивом. Решение есть. 1.-Ваш сервис должен быть возвращен наблюдаемым. НЕ подписывайтесь на сервис 2.-Переместите ваш код из конструктора в ngInit 3.-Находится в функции подписки, где у вас есть значение searchData

Трудно понять ваш код для меня, но, если ваш сервис возвращает Observables, а не данные, я полагаю, что ваш компонент может быть похож на

constructor(private completerService: CompleterService, 
            private router: Router, public back: BackService){}
ngOnInit()
{
  this.back.getArray().subscribe(res=>{
      this.searchData=res;
      completerService.local(this.searchData, 'name', 'name').subscribe(res=>
      {
          this.dataService=res;
      });
  })
}

//Or , better, using switchMap
ngOnInit()
{
  this.back.getArray().pipe(switchMap(res=>{
      this.searchData=res;
      return completerService.local(this.searchData, 'name', 'name')
      }))
      .subscribe(res=>
      {
          this.dataService=res;
      });
}
0 голосов
/ 30 августа 2018

Метод getArray () не возвращает никакого массива, но когда вы подписываетесь на свой afDatabase.list, вы получаете массив значений, который я предполагаю, и, следовательно, в обратном вызове подписки вы должны присвоить значение вашему массиву.

getArray(): void {
this.afDatabase.list('/imones')
  .valueChanges()
  .subscribe(res => {
    console.log(res)//should give you the array of percentage.
    this.searchData = res;
  })}

Или, если вы получаете значения одно за другим, напишите

getArray(): void {
    this.afDatabase.list('/imones')
      .valueChanges()
      .subscribe(res => {
        console.log(res)//should give you the array of percentage.
        this.searchData.push(res); //searchData must be initialized as empty array
      })
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...