angular 4.4 * ngЕсли не обновляется при изменении подписки переменных - PullRequest
0 голосов
/ 26 ноября 2018

Я хочу, чтобы некоторые элементы сети появлялись или исчезали, если назначена переменная или нет.Я подписываюсь на службу для получения этой переменной, но элементы с * ngIf не обновляются при изменении переменной.

Служба в users.service:

public getMyProfile(): Observable<Profile> {

  return Observable.create(observer => {
    this.getProfile().subscribe(
      profile => {
        this.avatarService.getAvatar(profile.avatarId).subscribe(
          avatar => {
            profile.avatar = avatar;
            observer.next(profile);
            observer.complete();
          }, error => observer.error(error));
      }, error => observer.error(error));
  });
}

компонентимеет подписку для получения переменной профиля:

export class NavBarComponent implements OnInit {

    public profile: Profile;
    private subscription: Subscription;

  constructor(
    public alertService: AlertService,
    public utilsService: UtilsService,
    public userService: UserService
  ) {
    this.utilsService.currentUser = Login.toObject(localStorage.getItem(AppConfig.LS_USER));
    this.utilsService.role = Number(localStorage.getItem(AppConfig.LS_ROLE));
  }

  ngOnInit(): void {

    this.userService.getMyProfile().subscribe(
      ((profile: Profile) => {
        this.profile = profile;   // this is the subscription where I get the profile variable
      }),
      ((error: Response) => {
        this.alertService.show(error.toString());
      }));

  }
}

И в шаблоне у меня есть * ngIf, чтобы показать или скрыть элементы, если есть профиль или нет:

<a *ngIf="profile" mat-button routerLink="/home">{{ 'HOME.TITLE' | translate }}</a>

Я искал и пробовал разные вещи, но элементы всегда видны или всегда невидимы.Они не меняются при изменении переменной профиля.Но если переменный профиль меняется и я перезагружаюсь, то он меняется по желанию.

1 Ответ

0 голосов
/ 26 ноября 2018

Почему у вас observer.complete();?

Удалите эту строку и повторите тест.После того как вы позвоните complete(), ваши next() вызовы будут игнорироваться.См. post для подробного объяснения.

Ванильный субъект (созданный с помощью нового Rx.Subject ()) реализует эту грамматику: когда onCompleted вызывается один раз, все последующие вызовыtoNext игнорируются.Второй вызов onCompleted для того же наблюдателя также игнорируется.Если наблюдатель подписывается на наблюдаемую сторону субъекта, его обратный вызов onComplete будет немедленно вызван

...