"privado" y "público" en el componente Angular 2


Si no me agrega private antes de foo, loadBar, ytext, creo que son public por defecto.

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

¿Hay algún caso de uso cuando están public en el componente?

Por razones de encapsulación/seguridad, ¿debo agregar siempre private para todos ellos como a continuación?

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

Gracias

Author: Hongbo Miao, 2016-05-29

2 answers

Hay mucho que decir en respuesta a esta pregunta, estos son los primeros pensamientos que saltaron a mi mente:

En primer lugar, tenga en cuenta que private es solo una construcción en tiempo de compilación-no se puede aplicar en tiempo de ejecución (vea aquí y aquí para una discusión relevante). Como tal, por favor desengáñese de cualquier noción de que private sea útil de alguna manera por motivos de seguridad. Simplemente no se trata de eso.

es sobre la encapsulación, y cuando tienes un campo o método en tu componente que deseas encapsular en él, dejando claro que no se debe acceder desde ningún otro lugar, entonces debes hacerlo private: Eso es para lo que private es: Indica tu intención que lo que sea que lo hayas puesto no debe tocarse desde fuera de la clase.

Lo mismo ocurre con public: También es una construcción de solo tiempo de compilación, por lo que el hecho de que los miembros de la clase sean public por defecto, mientras que true, tiene exactamente cero es decir, en tiempo de ejecución. Pero cuando tienes un miembro que tienes la intención explícita de exponer al mundo exterior como parte de la API de tu clase, debes hacer que public señale esta intención: Para eso es public.

Todo esto es aplicable a Typescript en general. En Angular específicamente, hay casos de uso definitivamente válidos para tener miembros públicos en clases de componentes: Por ejemplo, al implementar el patrón container/component (también conocido como smart/dumb) , con los niños " tontos "inyectando a los padres" inteligentes " a través de la inyección del constructor, es extremadamente importante comunicar su intención sobre lo que los miembros del padre deben y no deben ser tocados por los niños: De lo contrario, no se sorprenda cuando vea a esos niños tontos jugando en el gabinete de licores de sus padres.

Entonces, mi respuesta a tu pregunta: {[10]]}

¿Debo agregar siempre privado para todos ellos como a continuación?

Es un enfático no. Usted no debería siempre agregar private porque al hacerlo usted derrota el propósito de la palabra clave, porque ya no indica ninguna intención si la pone en todas partes: Es mejor que no la ponga en ninguna parte.

 131
Author: drewmoore,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-29 03:38:58

@drewmoore proporciona una buena respuesta en que lo privado/público se reduce a la intención. Pero hay algunas cosas más a considerar cuando se utilizan valores privados inyectados:

Si queremos emitir TypeScript como salida del proceso de compilación AoT debemos asegúrese de que solo accedemos a los campos públicos en las plantillas de nuestro componentes**

 7
Author: Lucas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-19 18:42:26