2016-12-09 4 views
2

Каков правильный способ преобразования объекта из списка firebase?Правильный способ преобразования объекта из списка Firebase?

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

loadAccountUsers() { 
     return this.af.database.list(`accounts/${this.authService.accountUID}/accountUsers`) 
      .flatMap(list => list) 
      .map((data: any) => { 
       let role: string = (data.accountLevel === 10 ? 'Administrator' : 'User'); 
       return { 
        firstName: data.firstName, 
        lastName: data.lastName, 
        emailAddress: data.emailAddress, 
        role: role 
       }; 
      }) 
      .scan((arr, val) => arr.concat([val]), []) 
    } 

Когда я не превращайте объекты все нормально

loadAccountUsers() { 
     return this.af.database.list(`accounts/${this.authService.accountUID}/accountUsers`) 
} 

ответ

2

flatMap излучает каждый элемент списка в наблюдаемом потоке. Когда база данных изменяется, и другой список испускается, его элементы также испускаются. Однако операция scan объединяет испускаемые элементы в единый массив - следовательно, дубликаты.

Вы могли бы вместо этого использовать RxJS map оператора и метод Array.prototype.map решить проблему:

loadAccountUsers() { 
    return this.af.database.list(`accounts/${this.authService.accountUID}/accountUsers`) 
     .map((list) => list.map((data) => { 
      let role: string = (data.accountLevel === 10 ? 'Administrator' : 'User'); 
      return { 
       firstName: data.firstName, 
       lastName: data.lastName, 
       emailAddress: data.emailAddress, 
       role: role 
      }; 
     })); 
} 
Смежные вопросы