Angular2 fire прослушивает изменения узла, выдает ошибку - PullRequest
0 голосов
/ 05 июня 2018

Приведенный ниже код работал, и он должен прослушивать изменения в узле и выполнять функцию, но теперь я получаю ошибку:

ncaught TypeError: Object(...) is not a function
at SwitchMapSubscriber.eval [as project] (changes.js:7)

Итак, в моем angular2 компоненте у меня есть:

private subscriptions = new Subscription();

registered: AngularFireList<any>;
constructor(private _af: AngularFireDatabase){
     this.registered = _af.list('/registered');
 }

ngOnInit() {
    this.subscriptions.add(
        this.registered.valueChanges().subscribe(
            res => {
                console.log("the value has changed");
            }
        )
    );
}

Итак, где я ошибаюсь, когда получаю ошибку, выше которой указывается:

angular2fire/database/list/changes

Что мне нужно, чтобы мой код делал, так это слушал всякий раз, когда происходит изменение в базе огняузел и журнал для консоли

Подписки также были определены следующим образом:

    private subscriptions = new Subscription();

Добавив его в подписки, я смогу использовать onDestroy жизненный цикл и предотвратить утечки памяти, как показано ниже

    ngOnDestroy() {
      this.subscriptions.unsubscribe();
    }

Ответы [ 2 ]

0 голосов
/ 06 июля 2018

Это популярная проблема в наши дни.Пожалуйста, обновите rxjs 5 до версии 6.

Это происходит из-за некоторых критических изменений в AngularFire.После обновления функция должна работать должным образом.

Обновление с использованием: npm install rxjs@6 rxjs-compat@6 --save ( Рекомендуется )

Или откат ( Не рекомендуется ) с использованием:

npm uninstall angularfire2
npm install angularfire2@5.0.0-rc.4
npm uninstall firebase
npm install firebase@4.8.0

См. rxjs официальный документ по миграции для получения инструкций и более подробной информации об изменениях между 5 и 6.

0 голосов
/ 29 июня 2018

Кажется, у вас нет списка для ваших подписок, а только одна подписка, хранящаяся в subscriptions.Попробуйте изменить его на массив следующим образом:

private subscriptions: Subscription[] = [];

registered: AngularFireList<any>;
constructor(private _af: AngularFireDatabase){
     this.registered = _af.list('/registered');
 }

ngOnInit() {
    this.subscriptions.push(
        this.registered.valueChanges().subscribe(
            res => {
                console.log("the value has changed");
            }
        )
    );
}

ngOnDestroy() {
   this.subscriptions.forEach((s) => s.unsubscribe());
}

С Subscription.add вы фактически добавите TeardownLogic к существующей подписке.Это можно использовать, когда вам нужно выполнить дополнительную очистку.

Если вы знаете, что у вас будет только одна подписка, используйте оператор присваивания = вместо функции add(), например:

private subscription: Subscription;

registered: AngularFireList<any>;
constructor(private _af: AngularFireDatabase){
     this.registered = _af.list('/registered');
 }

ngOnInit() {
    this.subscription =
        this.registered.valueChanges().subscribe(
            res => {
                console.log("the value has changed");
            }
     );
}

ngOnDestroy() {
   this.subscription.unsubscribe();
}
...