"Приватне" та "публічне" в кутовому компоненті


120

Якщо я не додаю приватні раніше foo, loadBarі text, я вважаю, вони є загальнодоступними .

export class RandomComponent {
  @Input() foo: string;
  @Output() loadBar = new EventEmitter();
  text: string;
}

Чи є якісь випадки використання, коли вони знаходяться publicв компоненті?

З інкапсуляції / безпеки, чи слід завжди додавати privateвсі такі, як нижче?

export class RandomComponent {
  @Input() private foo: string;
  @Output() private loadBar = new EventEmitter();
  private text: string;
}

Дякую


Щоб бути простою, приватна функція може використовуватись лише в компоненті. Неможливо отримати доступ до приватної функції з іншого компонента. Припустимо, під час обслуговування, якщо функція оголошується приватною, вона не може отримати доступ з будь-якого іншого компонента.
Кевін

Відповіді:


202

У відповідь на це запитання можна сказати багато, це перші думки, які мені спали на думку:

Перш за все, майте на увазі, що privateце лише конструкція часу компіляції - вона не може бути застосована під час виконання (див. Тут та тут для відповідної дискусії). Будь ласка, відключіть себе від будь-яких уявлень про privateкорисність будь-яким чином в цілях безпеки. Це просто не те, про що йдеться.

Він знаходиться близько інкапсуляції, і коли у вас є поле або метод на компоненті , який ви хочете , щоб инкапсулировать в ньому, даючи зрозуміти , що він не повинен бути доступний з будь-яких інших, то ви повинні абсолютно зробити це private: Це те, що privateє для: Це сигналізує про ваше наміри, що все, що ви поставили, не слід чіпати з-за класу.

Те ж саме стосується public: це теж конструкція, що відповідає лише часу компіляції, тому той факт, що члени класу publicза замовчуванням, тоді як true, має точно нульове значення під час виконання. Але коли у вас є член, який ви явно маєте намір виставити зовнішньому світу як частину API вашого класу, вам слід абсолютно зробити так, publicщоб він сигналізував про цей намір: Ось для чого public.

Це все стосується Typescript взагалі. Зокрема, у Angular, безумовно, є дійсні випадки використання для публічних членів у класах компонентів: Наприклад, при реалізації шаблону контейнера / компонента (він же розумний / німий ), коли "німі" діти вводять "розумних" батьків за допомогою конструкторської інжекції, надзвичайно важливо донести свої наміри до того, що члени батька повинні, а чого діти не повинні чіпати: інакше не дивуйтеся, коли ви зловили тих німих дітей, які дуріли в кабінеті алкогольних напоїв батьків.

Отже, моя відповідь на ваше запитання:

я завжди повинен додавати приватне для всіх, як нижче?

є наголос ні . Ви не завжди повинні додавати, privateтому що ви перемагаєте мету ключового слова, оскільки воно більше не сигналізує про будь-які наміри, якщо ви розміщуєте його скрізь: Ви також можете нікуди не розміщувати його.


5
Дякую за пояснення. Але, можливо, я помиляюся: я розумію, що більшість часу властивості та методи повинні бути приватними (= "лише для використання цього компонента"). Тож відповідь повинна бути "ТАК за замовчуванням, доки хлопцю не потрібно виставляти властивість / метод зовні". Немає ? Навіщо закінчувати своє пояснення, відповідаючи "ні" (що звучить як "ніколи")?
M'sieur Toph '21

1
Я червоний кутовий 2 підручники, і я не зрозумів, коли я повинен використовувати загальнодоступні. Варіантів комунікації компонентів дуже багато: angular.io/docs/ts/latest/cookbook/… Можливо, нам слід використовувати public лише для властивостей та методів, визначених через Input Output. Але я не впевнений.
Руслан Боровок

Зазвичай мені доводиться використовувати "public", коли я декларую властивість у конструкторі, який не використовується всередині класу, але використовується зовні (тобто всередині шаблону чи іншого компонента).
tuliomarchetto

18

@drewmoore дає хорошу відповідь, коли приватний / громадський зводиться до наміру. Але є ще кілька речей, які слід враховувати при використанні введених приватних значень:

Якщо ми хочемо видавати TypeScript як вихід процесу компіляції AoT, ми повинні переконатися, що ми маємо доступ до лише публічних полів у шаблонах наших компонентів **


По-перше, ці помилки: ці помилки не мають нічого спільного з тим, що член є приватним або публічним, вони просто вказують на те, що одна не використовується. Ваші два другі пункти були б дійсними, якби питання стосувалося посилання на приватних членів у шаблонах , але це не так. Подивіться тут на питання, яке було
намалював мур

@drewmoore, ви праві, і я розумію, що вони вказують, що вони не використовуються. Однак, загальнодоступні змінні можуть використовуватися зовні, щоб це ніколи не викликало це попередження. Що стосується самих питань "Чи є випадок використання, коли вони є загальнодоступними в компоненті?", Я вважаю, що мій другий і третій пункти принаймні вказують на випадок використання, коли вони є загальнодоступними , зокрема, коли ви хочете використовувати їх у шаблоні. (як зазначено в цитованому тексті).
Лукас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.