невозможно получить доступ к значению объекта typeScript - PullRequest
0 голосов
/ 24 апреля 2020

Я работаю в Angular 8. У меня есть класс модели с именем Basic, для хранения базовой c информации профиля. В моем компоненте объект типа Basic будет возвращен из Service, служба получит значения с сервера. В моем компоненте, когда я печатаю объект Basic, он показывает, что есть значения, но когда я пытаюсь получить доступ к этим значениям, он показывает неопределенный. Мой класс Basic имеет геттер / сеттер.

Сервисный код

bas: Basic = new Basic();

  public getCurrentUserBasic() {
    return this.http.get<Basic>(
      'http://127.0.0.1:8080/public/profile/basic/findOneByUser', this.authService.getHeader(),
    ).subscribe((b: Basic) => {
      this.loading = false;
      console.log(b);

      // phone number
      for (const key in b['phone_number']) {
        const phoneNumber = new PhoneNumber();
        phoneNumber.$id = b['phone_number'][key]['id'];
        phoneNumber.$number = b['phone_number'][key]['number'];
        this.phoneNumbers.push(phoneNumber);
      }

      // basic information
      this.bas.$id = b['id'];
      this.bas.$name = b['name'];
      this.bas.$birthDate = b['birthDate'];
      this.bas.$gender = b['gender'];
      this.bas.$blood_Group = b['blood_Group'];
      this.bas.$religion = b['religion'];
      this.bas.$email = b['email'];
    });
  }// get current user basic.


public getBasicInformation() {
    return this.bas;
  }

Компонент

public setBasicInformation() {
    try {
      var basic: Basic = this.basicService.getBasicInformation();
      this.name = basic.$name;
      console.log(this.name);
      console.log('\n\n name : ' + basic['name']);
      console.log('\n\n $name : ' + basic.$name);
      this.birthDate = basic.$birthDate;
      this.gender = basic.$gender;
      console.log(basic);
    } catch (e) {
      console.log('Error in Setting Basic Information!');
    }
  }

Ниже напечатаны строки undefined.

console.log(this.name);// should not work, as property is private in model class.
console.log('\n\n name : ' + basic['name']);
console.log('\n\n $name : ' + basic.$name);

Пока результат этой строки console.log(basic); ниже: Result of Basic

Класс модели

export class Basic {
  private id: string;
  private userId: string;
  private name: string;
  private birthDate: string;
  private care_of: string;
  private gender: string;
  private maritalStatus: string;
  private profession: string;
  private blood_Group: string;
  private available: string;
  private religion: string;
  private email: string;

  /**
   * Getter $id
   * @return {string}
   */
  public get $id(): string {
    return this.id;
  }

  /**
   * Getter $userId
   * @return {string}
   */
  public get $userId(): string {
    return this.userId;
  }

  /**
   * Getter $name
   * @return {string}
   */
  public get $name(): string {
    return this.name;
  }

  /**
   * Getter $birthDate
   * @return {string}
   */
  public get $birthDate(): string {
    return this.birthDate;
  }

  /**
   * Getter $care_of
   * @return {string}
   */
  public get $care_of(): string {
    return this.care_of;
  }

  /**
   * Getter $gender
   * @return {string}
   */
  public get $gender(): string {
    return this.gender;
  }

  /**
   * Getter $maritalStatus
   * @return {string}
   */
  public get $maritalStatus(): string {
    return this.maritalStatus;
  }

  /**
   * Getter $profession
   * @return {string}
   */
  public get $profession(): string {
    return this.profession;
  }

  /**
   * Getter $blood_Group
   * @return {string}
   */
  public get $blood_Group(): string {
    return this.blood_Group;
  }

  /**
   * Getter $available
   * @return {string}
   */
  public get $available(): string {
    return this.available;
  }

  /**
   * Setter $id
   * @param {string} value
   */
  public set $id(value: string) {
    this.id = value;
  }

  /**
   * Setter $userId
   * @param {string} value
   */
  public set $userId(value: string) {
    this.userId = value;
  }

  /**
   * Setter $name
   * @param {string} value
   */
  public set $name(value: string) {
    this.name = value;
  }

  /**
   * Setter $birthDate
   * @param {string} value
   */
  public set $birthDate(value: string) {
    this.birthDate = value;
  }

  /**
   * Setter $care_of
   * @param {string} value
   */
  public set $care_of(value: string) {
    this.care_of = value;
  }

  /**
   * Setter $gender
   * @param {string} value
   */
  public set $gender(value: string) {
    this.gender = value;
  }

  /**
   * Setter $maritalStatus
   * @param {string} value
   */
  public set $maritalStatus(value: string) {
    this.maritalStatus = value;
  }

  /**
   * Setter $profession
   * @param {string} value
   */
  public set $profession(value: string) {
    this.profession = value;
  }

  /**
   * Setter $blood_Group
   * @param {string} value
   */
  public set $blood_Group(value: string) {
    this.blood_Group = value;
  }

  /**
   * Setter $available
   * @param {string} value
   */
  public set $available(value: string) {
    this.available = value;
  }


  /**
   * Getter $religion
   * @return {string}
   */
  public get $religion(): string {
    return this.religion;
  }

  /**
   * Setter $religion
   * @param {string} value
   */
  public set $religion(value: string) {
    this.religion = value;
  }

  /**
   * Getter $email
   * @return {string}
   */
  public get $email(): string {
    return this.email;
  }

  /**
   * Setter $email
   * @param {string} value
   */
  public set $email(value: string) {
    this.email = value;
  }

}//class

Согласно насколько мне известно, эти две строки должны печатать значения:

console.log('\n\n name : ' + basic['name']);
console.log('\n\n $name : ' + basic.$name);

, тогда как эта console.log(basic); печатает значения.

1 Ответ

0 голосов
/ 24 апреля 2020

Я думаю, что вы вызываете setBasicInformation() до того, как сервер вернулся с ответом в вашей функции getCurrentUserBasic().

В Javascript объекты передаются по ссылке, ваши var basic в setBasicInformation() ссылаются на this.bas из вашей службы.

Когда вы регистрируете объект на консоли, он обновляет значение журнала при обновлении базового объекта, например console.log (basi c) начнет отражать значение this.bas даже в консоли, как только он обновляется в службе.

Хотя это не тот случай, когда console.log для строк, он всегда будет записывать абсолютное значение во время

Следующие две строки записывают строки в то время, когда значение basi c равно нулю, следовательно, они регистрируют неопределенное значение.

console.log('\n\n name : ' + basic['name']);
console.log('\n\n $name : ' + basic.$name);

Измените setBasicInformation(), чтобы установить значения в подписаться fn getCurrentUserBasic и передать значения через getBasicInformation()


public getCurrentUserBasic() {
      return this.http.get<Basic>(
        'http://127.0.0.1:8080/public/profile/basic/findOneByUser', this.authService.getHeader())
    }


  public getBasicInformation( b ) {
        // phone number
        for (const key in b['phone_number']) {
          const phoneNumber = new PhoneNumber();
          phoneNumber.$id = b['phone_number'][key]['id'];
          phoneNumber.$number = b['phone_number'][key]['number'];
          this.phoneNumbers.push(phoneNumber);
        }

        // basic information
        this.bas.$id = b['id'];
        this.bas.$name = b['name'];
        this.bas.$birthDate = b['birthDate'];
        this.bas.$gender = b['gender'];
        this.bas.$blood_Group = b['blood_Group'];
        this.bas.$religion = b['religion'];
        this.bas.$email = b['email'];
      return this.bas;
    }

  public setBasicInformation() {
      try {
        this.basicService.getCurrentUserBasic().pipe ( map ( this.basicService.getBasicInformation ())).subscribe ( basic => {
          this.name = basic.$name;
          console.log(this.name);
          console.log('\n\n name : ' + basic['name']);
          console.log('\n\n $name : ' + basic.$name);
          this.birthDate = basic.$birthDate;
          this.gender = basic.$gender;
          console.log(basic);
        });

      } catch (e) {
        console.log('Error in Setting Basic Information!');
      }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...