2016-05-29 15 views
57

Wenn ich nicht hinzufügen private vor foo, loadBar und text, ich glaube, sie öffentliche standardmäßig ist."private" und "public" in Angular 2 Komponente

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

Gibt es einen Anwendungsfall, wenn sie public in der Komponente?

Für die Einkapselung/Sicherheitsgrund, sollte ich immer private für alle von ihnen wie unten hinzufügen?

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

Dank

Antwort

100

Es gibt eine Menge in Antwort auf diese Frage zu sagen, das sind die ersten Gedanken, die mir in den Sinn sprang:

In erster Linie im Auge behalten, dass private nur eine ist Kompilierzeit Konstrukt - es kann nicht zur Laufzeit durchgesetzt werden (siehe here und here für relevante Diskussion). Als solches sollten Sie sich bitte davon distanzieren, dass die Begriffe private in irgendeiner Weise für Sicherheitszwecke nützlich sind. Darum geht es einfach nicht.

Es ist über Kapselung, und wenn Sie ein Feld oder eine Methode auf Ihrer Komponente, die Sie darin einkapseln wollen, machen Sie es klar, dass es von nirgendwo anders zugegriffen werden sollte, dann sollten Sie es unbedingt machen private: Das ist private ist für: Es signalisiert Ihre Absicht, dass, was auch immer Sie es angezogen haben, nicht von außerhalb der Klasse berührt werden sollte.

Das gleiche gilt für public: Es ist auch ein Compile-Time-only-Konstrukt, so dass die Klassenmitglieder standardmäßig public sind, während wahr, hat genau null Bedeutung zur Laufzeit. Aber wenn Sie ein Mitglied haben, das Sie explizit der Außenwelt als Teil der API Ihrer Klasse zugänglich machen wollen, sollten Sie es unbedingt public setzen, um diese Absicht zu signalisieren: Das ist, was public ist.

Dies gilt alles für Typescript im Allgemeinen. Speziell in Angular gibt es definitiv gültige Anwendungsfälle für öffentliche Mitglieder in Komponentenklassen: Wenn zum Beispiel das Muster container/component (aka smart/dumb) implementiert wird und "dumme" Kinder "intelligente" Eltern über die Konstruktorinjektion injizieren, ist dies extrem wichtig kommunizieren Sie Ihre Absicht darüber, welche Mitglieder des Elternteils nicht von den Kindern berührt werden sollten und sollten: Seien Sie nicht überrascht, wenn Sie diese dummen Kinder in Ihrem Likörschrank ertappen.

meine Antwort auf Ihre Frage also:

für alle von ihnen wie unter

sollte ich immer privat hinzufügen?

ist ein emphatisches no. Sie sollten nicht immerprivate hinzufügen, weil Sie dabei den Zweck des Schlüsselwortes besiegen, weil es keine Absicht mehr signalisiert, wenn Sie es überall hinstellen: Sie könnten es genauso gut nirgendwo hinstellen.

+3

Dank für die ausführliche Erläuterung! –

+1

Danke für die Erklärung. Aber vielleicht verstehe ich es falsch: Ich verstehe, dass Eigenschaften und Methoden meistens privat sein müssen (= "nur für diese Komponente verwenden"). Daher sollte die Antwort "JA" lauten, solange der Typ die Eigenschaft/Methode nicht nach außen hin offenlegen muss. " Nein ? Warum schließen Sie Ihre Erklärung, indem Sie "nein" (was wie ein "nie" klingt) beantworten? –

+0

ich rote eckige 2 Tutorials, und ich habe nicht herausgefunden, wenn ich öffentlich verwenden sollte. Es gibt viele Varianten für die Komponentenkommunikation: https://angular.io/docs/ts/latest/cookbook/component-communication.html# Wahrscheinlich sollten wir public nur für Eigenschaften und Methoden verwenden, die über Input Output definiert wurden. Aber ich bin mir nicht sicher. –

6

@drewmoore bietet eine gute Antwort in diesem privaten/öffentlichen kocht auf Absicht.Aber es gibt noch ein paar Dinge zu beachten, wenn sie injiziert privaten Werten:

Wenn wir Typoskript als Ausgang des AoT Kompilierungsvorgang müssen wir sicherstellen, dass wir nur Zugriff auf publi emittieren wollen c Felder in den Vorlagen unserer Komponenten **

+0

zu Ihrem ersten Punkt: Diese Fehler haben nichts damit zu tun, dass ein Mitglied privat oder öffentlich ist, sie zeigen lediglich an, dass eines nicht verwendet wird. Ihre zweiten beiden Punkte wären gültig, wenn es sich bei der Frage um die Bezugnahme auf private Mitglieder * in Vorlagen * handelte, ist dies aber nicht. [Siehe hier für eine Frage, die] (http://stackoverflow.com/questions/34574167/angular2-should-private-variables-be-accessible-in-the-template/34574732#34574732) – drewmoore

+0

@drewmoore, Sie sind richtig, und ich verstehe, dass sie angeben, dass sie nicht verwendet werden. Öffentliche Variablen können jedoch extern verwendet werden, sodass sie diese Warnung niemals auslöst. Zu den Fragen selbst "Gibt es einen Anwendungsfall, wenn sie in der Komponente öffentlich sind?", Glaube ich, dass meine zweiten und dritten Punkte zumindest einen Anwendungsfall angeben, wenn sie öffentlich sind, insbesondere wenn Sie sie in der Vorlage verwenden möchten (wie im zitierten Text angegeben). – Lucas

Verwandte Themen