Попытка подписаться на тему поведения в моем компоненте профиля пользователя, но я продолжаю получать начальное нулевое значение - PullRequest
1 голос
/ 31 марта 2020

У меня есть компонент профиля пользователя, который пытается подписаться на тему поведения в моей службе пользователя. Я установил начальное значение поведения с нулевым значением. Когда пользователь регистрируется, я также передаю значения своему пользовательскому объекту в моем компоненте регистрации, а затем передаю те же значения в метод, который сохраняет их в моей следующей теме.

Хотя, когда я подписываюсь в моем ngOnIt на свой компонент профиля пользователя, я получаю только первоначальное значение. Я что-то здесь упускаю? Из того, что я прочитал, я проверил, чтобы убедиться, что я не предоставляю несколько экземпляров моего User Service, и я использовал value, getValue и подписку, чтобы получить значение. Все возвращается ноль.

export class UserProfileComponent implements OnInit {

user: User;

  ngOnInit() {
// My problem.
    this.user = this.userService.getSavedUser().getValue();
    console.log(this.user);
  }

}
// object

export class User {
    firstName: string;
    lastName: string;
    email: string;
    mobile: string;
    uid: string;
    termsOfAgreement: boolean;

    constructor(
        email: string,
        mobile: string,
        firstName: string,
        lastName: string,
        uid: string,
        termsOfAgreement: boolean
    ) {
        this.email = email;
        this.mobile = mobile;
        this.firstName = firstName;
        this.lastName = lastName;
        this.uid = uid;
        this.termsOfAgreement = false;

    }
}
signup.component.ts

onSignup(signupFormData) {
        return this.afAuth.auth.createUserWithEmailAndPassword(signupFormData.value.email, signupFormData.value.password)
            .then(userInfo => {
                // Pass in user info into to user object. 
                const user: User = new User(signupFormData.value.email,
                    signupFormData.value.mobile, signupFormData.value.firstName,
                    signupFormData.value.lastName,
                    userInfo.user.uid, false);
                this.writeNewUser(user);

            }).catch((error) => {
                this.showError = true;
                this.errorMessage = error.message;
            })
    }

    private writeNewUser(user: User): void {
        this.userService.addUser(user);
    }


// user.service.ts

export class UserService {

  private subject: BehaviorSubject<User> = new BehaviorSubject(null);


public addUser(user: User): void {
    this.db
      .collection("users")
      .doc(user.uid)
      .set(Object.assign({}, user));
    this.saveUser(user);
  }

  public saveUser(user: User) {
    this.subject.next(user);
  }

  public getSavedUser(): BehaviorSubject<User> {
    return this.subject;
  }
}

1 Ответ

1 голос
/ 31 марта 2020

Как вы написали, проблема в вашем компоненте. Вы не подписались на Subject, но пытались получить значение во время выполнения метода ngOnInit.

export class UserProfileComponent implements OnInit {
  user: User;

  ngOnInit() {
    this.userService.getSavedUser().subscribe(
      (value) => {
        this.user = value;
        console.log(this.user);
      }
    );
  }

}

Теперь вы будете получать каждое значение, испускаемое Subject, начиная с момента, когда вы подписались на него (и в последний раз)

Примечание:

Рекомендуется возвращать субъект, приведенный к Observable (в вашем UserService). Когда вы возвращаете Subject, кто-то может использовать следующий метод и выдавать какое-то значение. Если вы хотите, чтобы только служба выдавала новые значения, вы должны вернуть this.subject.asObservable() (и изменить ввод)

Примечание 2:

Не забудьте отписаться от субъекта при уничтожении компонента - метод ngOnDestroy

...