AngularFire在我的组件中仅订阅触发一次,但是在我的html模板中工作正常

时间:2018-10-08 14:44:36

标签: angular firebase rxjs firebase-authentication angularfire2

我正在使用firebase构建Angular登录应用,并且尝试在组件中订阅用户Obs​​ervable,如下所示:

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 - Not Setting Class Variable in Same Scope,但是由于我正在组件中进行订阅而不是在服务中进行操作,所以我看不到它如何适用于我的代码。

*更新*

现在我想知道这是某种错误还是版本控制问题。我用以下代码替换了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 );
    });
  }
}

这很好用,这向我暗示,该问题与火力地堡提供的特定可观察物有所关系。不过,不知道该怎么办。我能想到的一切都是骇人听闻的。

*更新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对象的值保持更新。我不知道发生了什么,但是它可以满足我的需求。

0 个答案:

没有答案