#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