Цикл по наблюдаемому <Object []> в Typescript - PullRequest
0 голосов
/ 29 апреля 2018

У меня есть база данных Firebase ... Так что это все JSON. Я получаю данные, используя базу данных AngularFire2 ... Я читаю этот учебник ...

Часть кода для этого вопроса:

noteList: Observable<Note[]>

  constructor(public navCtrl: NavController, private noteListService: NoteListService) {
    this.noteList = this.noteListService.getNoteList()
      .snapshotChanges()
      .map(
      changes => {
        return changes.map(c => ({
          key: c.payload.key, ...c.payload.val()
        }))
      });

Отсюда я хочу сделать 2 вещи:

  • 1-й: объявить переменную массива за пределами конструктора, как noteList Пример: myVar: Note[] = new Array();
  • 2-й: Итерируемый, хотя результат getNoteList() и вставка их в эту переменную для дальнейшего использования ... Я надеюсь, что myVar будет содержать несколько объектов Note ... => это JSON из Firebase поэтому объекты JavaScript ...

Как мне это сделать?

До сих пор я использовал следующее:

this.noteList .forEach(value => console.log(value)); Это будет регистрировать каждый элемент noteList как Array [Object] ....

Когда я делаю this.noteList .forEach(value => this.myVar.push(value));, он говорит:

Аргумент типа «Примечание []» присваивается параметру типа «Примечание». Свойство 'id' отсутствует в типе 'Note []'

Полный код класса:

export class HomePage {

  noteList: Observable<Note[]>
  myVar : Note[] = new Array();

  constructor(public navCtrl: NavController, private noteListService: NoteListService) {
    this.noteList = this.noteListService.getNoteList()
      .snapshotChanges()
      .map(
      changes => {
        return changes.map(c => ({
          key: c.payload.key, ...c.payload.val()
        }))
      });
  }

  this.noteList .forEach(value => this.myVar.push(value));

  //Then below, I want to use it in a Jquery 

  $(function() {
     // Also, I don't know how to access neither noteList nor myVar here. Any help here will be appreciated also
  }
}

Не могли бы вы помочь, пожалуйста, сделайте это ...

1 Ответ

0 голосов
/ 29 апреля 2018

Правильный способ сделать это с помощью RxJS - подписаться на наблюдаемое и выполнить все необходимые действия с результатом внутри subscribe обратного вызова. Если наблюдаемое не используется повторно, нет необходимости сохранять его в noteList, но, возможно, необходимо сохранить подписку, чтобы отписаться от нее и избежать утечек памяти:

  noteListSubscription: Subscription;

  constructor(private noteListService: NoteListService) {
    this.noteListSubscription = this.noteListService.getNoteList()
      .snapshotChanges()
      .map(
      changes => {
        return changes.map(c => ({
          key: c.payload.key, ...c.payload.val()
        }))
      })
      .subscribe(notes => { this.myVar = notes });
  }

  ngOnDestroy() {
    noteListSubscription.unsubscribe();
  }

Subscription тип должен быть импортирован из rxjs модуля.

...