AngularFire подписывается только один раз в моем компоненте, но отлично работает в моем HTML-шаблоне - PullRequest
0 голосов
/ 08 октября 2018

Я создаю приложение для входа в Angular с использованием firebase и пытаюсь подписаться на пользователя Observable в моем компоненте следующим образом:

export class UserEditComponent implements OnInit {

  constructor(public authService: AuthService) {}

  ngOnInit() {
    this.authService.user.subscribe(user => {
      console.log(user);
    });
  }
}

Вот наблюдаемое, как определено в AuthService:

export class AuthService {

  public user: Observable<firebase.User>;

  constructor(public auth: AngularFireAuth) {
    this.user = auth.authState;
   }
}

Это прекрасно работает в моем HTML-шаблоне, где следующий список корректно обновляется каждый раз, когда обновляются данные пользователя:

<ul>
  <li><strong>name:</strong> {{ (authService.user | async)?.displayName }}</li>
  <li><strong>email:</strong> {{ (authService.user | async)?.email }}</li>
  <li><strong>phone:</strong> {{ (authService.user | async)?.phone }}</li>
  </ul>

Моя проблема заключается в том, что моя функция подписки запускается только один раз,Пользовательский объект регистрируется в консоли только при запуске.Я пытался переместить код из ngOnInit в конструктор, но результат тот же.Разве я не должен получать новый пользовательский объект, регистрируемый на консоли каждый раз, когда пользователь обновляется?

Я внимательно посмотрел на проблему AngularFire Observables / Subscribe - не задается переменная класса в той же области , но я не могу понять, как это применимо к моему коду, так как я делаю подписку в компоненте, а не в сервисе.

* ОБНОВЛЕНИЕ *

Теперь я 'Мне интересно, если это какая-то ошибка, или, возможно, проблема с версиями.Я заменил код AuthService следующим:

export class AuthService {

  public user: Observable<any>;

  constructor(public auth: AngularFireAuth) {
    this.user = Observable.create(function (observer) {
      setInterval(() => observer.next(new Date().toString()), 1000 );
    });
  }
}

Это прекрасно работает, что наводит меня на мысль, что проблема как-то связана с конкретной наблюдаемой, предоставляемой firebase.Не уверен, что с этим делать.Все, что я могу придумать, является хакерским.

* ОБНОВЛЕНИЕ 2 *

Кажется, что происходит то, что базовое пользовательское значение обновляется, хотя nextфункция не вызывается.Я не уверен, почему это так.Я изменил свой ngOnInit на что-то вроде этого:

export class UserEditComponent implements OnInit {

  public userCurrent: firebase.User;

  constructor(public authService: AuthService) {}

  ngOnInit() {
    obj = this;
    this.authService.user.pipe(first()).subscribe(user => {
      obj.userCurrent = user;
    });
  }
}

Значение объекта userCurrent остается обновленным.Я понятия не имею, что происходит, но это работает для того, что мне нужно.

...