“Private” e “public” nella componente angolare


120

Se non aggiungo privato prima foo, loadBare text, credo che siano pubblici per impostazione predefinita.

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

C'è qualche caso d'uso quando sono publicnel componente?

Per motivi di incapsulamento / sicurezza, devo sempre aggiungere privateper tutti loro come di seguito?

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

Grazie


Per essere semplici, una funzione privata può essere utilizzata solo nel componente. Non è possibile accedere a una funzione privata da un altro componente. Supponiamo che in servizio, se una funzione dichiara come privata, non può essere accessibile da nessun altro componente.
Kevin

Risposte:


202

C'è molto da dire in risposta a questa domanda, questi sono i primi pensieri che mi sono balzati in mente:

Prima di tutto, tieni presente che privateè solo un costrutto in fase di compilazione - non può essere applicato in fase di esecuzione (vedi qui e qui per la discussione pertinente). Pertanto, si prega di disilludere te stesso da qualsiasi idea di privateessere utile in qualsiasi modo per scopi di sicurezza. Semplicemente non è di questo che si tratta.

Si tratta su incapsulamento, e quando si dispone di un campo o un metodo sul componente che si desidera di incapsulare in essa, mettendo in chiaro che non dovrebbe essere accessibile da qualsiasi altro luogo, allora si dovrebbe assolutamente rendono private: Questo è quello che privateè per: Segnala il tuo intento che qualunque cosa tu abbia indossato non dovrebbe essere toccata dall'esterno della classe.

Lo stesso vale per public: anch'esso è un costrutto solo in fase di compilazione, quindi il fatto che i membri della classe siano publicper impostazione predefinita, sebbene sia vero, ha esattamente zero significato in fase di esecuzione. Ma quando hai un membro che intendi esporre esplicitamente al mondo esterno come parte dell'API della tua classe, dovresti assolutamente farlo publicper segnalare questo intento: questo è ciò che publicserve.

Questo è tutto applicabile a Typescript in generale. In Angular in particolare, ci sono casi d'uso decisamente validi per avere membri pubblici su classi di componenti: per esempio, quando si implementa il pattern container / component (aka smart / dumb ), con bambini "stupidi" che iniettano genitori "intelligenti" tramite l'iniezione del costruttore, è estremamente importante comunicare il tuo intento su ciò che i membri del genitore dovrebbero e non dovrebbero essere toccati dai bambini: altrimenti, non sorprenderti quando sorprendi quei bambini stupidi che scherzano nell'armadietto dei liquori dei loro genitori.

Quindi, la mia risposta alla tua domanda:

devo sempre aggiungere privato per tutti loro come sotto?

è un enfatico no . Non dovresti sempre aggiungere privateperché così facendo annulli lo scopo della parola chiave, perché non segnala più alcun intento se la metti ovunque: potresti anche non metterla da nessuna parte.


5
Grazie per la spiegazione. Ma forse mi sbaglio: capisco che la maggior parte delle volte proprietà e metodi devono essere privati ​​(= "solo per questo componente utilizzare"). Quindi la risposta dovrebbe essere "SÌ per impostazione predefinita, purché il ragazzo non abbia bisogno di esporre la proprietà / metodo all'esterno". No ? Perché concludere la tua spiegazione rispondendo "no" (che suona come un "mai")?
M'sieur Toph '21

1
Ho redatto 2 tutorial angolari e non ho capito quando dovrei usare public. Ci sono molte varianti per la comunicazione dei componenti: angular.io/docs/ts/latest/cookbook/… Probabilmente dovremmo usare public solo per proprietà e metodi definiti tramite Input Output. Ma non sono sicuro.
Ruslan Borovok

Di solito devo usare 'public' quando dichiaro una proprietà nel costruttore che non viene utilizzata all'interno della classe, ma viene utilizzata all'esterno (cioè all'interno di un template o di un altro componente).
tuliomarchetto

18

@drewmoore fornisce una buona risposta in quanto privato / pubblico si riduce all'intento. Ma ci sono alcune altre cose da considerare quando si utilizzano valori privati ​​iniettati:

Se vogliamo emettere TypeScript come output del processo di compilazione di AoT dobbiamo assicurarci di accedere solo ai campi pubblici nei template dei nostri componenti **


Riguarda il tuo primo punto: questi errori non hanno nulla a che fare con un membro che è privato o pubblico, indicano semplicemente che non viene utilizzato. I tuoi secondi due punti sarebbero validi se la domanda riguardasse il riferimento a membri privati nei modelli , ma non lo è. Vedi qui per una domanda che è
Drew Moore

@drewmoore, hai ragione e capisco che indicano che non vengono utilizzati. Tuttavia, le variabili pubbliche possono essere utilizzate esternamente in modo da non attivare mai l'avviso. Per quanto riguarda le domande stesse "C'è qualche caso d'uso quando sono pubblici nel componente?", Credo che il mio secondo e terzo punto indichino almeno un caso d'uso quando sono pubblici , in particolare, quando si desidera utilizzarli nel modello (come indicato nel testo citato).
Lucas
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.