Почему я вижу только свойства частного класса в ngModel

#angular #typescript #setter #ngmodel

#angular #typescript #установщик #ngmodel

Вопрос:

Когда я использую класс с частными свойствами в модели и средством получения / установки, у меня есть доступ только к частному свойству, но не к общедоступному с помощью средства получения / установки..

https://stackblitz.com/edit/angular-hx3t7g

Почему у меня в ngModel ‘_r’ вместо ‘r’? Как сделать это правильно / должен ли я вообще делать это так?

Ответ №1:

Это действительно отражает то, что вы написали в своем классе typescript Circle .

Если вы хотите иметь доступ к r атрибуту Circle , я не понимаю, зачем вам также иметь атрибут private.

Ваша модель должна быть просто:

 export class Circle {
  C: number;
  r: number;
}
  

Комментарии:

1. это не очень полезно… Я предполагаю, что вы даже не видели stackblitz. Я хочу вычислить одно свойство — C, когда модель получит r. Вот почему я использую setter для r.

Ответ №2:

Насколько я понимаю, вы вычисляете значение для C при настройке r . Похоже, ваш код правильный, но было бы лучше, если бы вы изменили C на private, поскольку вы на самом деле не хотите получать к нему доступ, поскольку его значение вычисляется на основе r .

 export class Circle {
  private C: number; // make C private
  private _r: number;

  set r(value: number) {
    this.C=2*3.14*value;
    this._r = value;
  }

  get r(): number {
    return this._r;
  }
}
  

Поскольку _r оно является частным, вы не сможете получить к нему доступ за пределами класса, и единственный способ изменить его — использовать r .

Ответ №3:

Итак, я нашел то, что искал..Если кто-нибудь тоже загуглит это:https://stackblitz.com/edit/angular-mkncdh

вы определяете свойство, которое хотите приватным, а затем устанавливаете для него значение enumerable = false, как вы можете видеть в circle.ts . Это стало немного сложнее, чем я хотел, но делает именно то, что я хочу. Теперь вы можете видеть на выходе, что в ngModel есть только эти общедоступные свойства 🙂

Комментарии:

1. К вашему сведению. По сути, это то же самое, что выводит typescript transpiler