2016-01-03 7 views
75

Wenn eine Variable für eine Komponentenklasse private deklariert ist, sollte ich dann in der Vorlage dieser Komponente darauf zugreifen können?Angular2 - sollen private Variablen in der Vorlage zugänglich sein?

@Component({ 
    selector: 'my-app', 
    template: ` 
    <div> 
     <h2>{{title}}</h2> 
     <h2>Hello {{userName}}</h2> // I am getting this name 
    </div> 
    `, 
}) 
export class App { 
    public title = 'Angular 2'; 
    private userName = "Test Name"; //declared as private 
} 
+5

@Yaroslav Admins Antwort ist korrekt. Bitte ändern Sie Ihre Auswahl für die Antwort. – maxisam

Antwort

56

Edit: Diese Antwort ist jetzt falsch. Es gab keine offizielle Anleitung zu dem Thema, als ich es gepostet habe, aber wie in @ Yaroslovs (ausgezeichnete und korrekte) Antwort erklärt, ist dies nicht mehr der Fall: Codelizer warnt jetzt und die AoT-Kompilierung wird bei Verweisen auf private Variablen in der Komponente fehlschlagen Vorlagen. Das heißt, auf einer konzeptionellen Ebene bleibt alles hier gültig, also werde ich diese Antwort so lassen, wie es hilfreich scheint.


Ja, das wird erwartet.

Denken Sie daran, dass private und andere Zugriffsmodifizierer Typescript-Konstrukte sind, während Komponenten/Controller/Templates kantige Konstrukte sind, von denen Typescript nichts weiß. Zugriffsmodifizierer steuern Sichtbarkeit zwischen Klassen: Erstellen eines Feldes verhindert andere Klassen von Zugriff darauf, aber Vorlagen und Controller sind Dinge, die innerhalb Klassen existieren.

Das ist technisch nicht richtig, aber (anstatt zu verstehen, wie Klassen sich auf Dekoratoren und ihre Metadaten beziehen), könnte es hilfreich sein, so zu denken, weil das Wichtigste (IMHO) ist, vom Nachdenken über das Template abzuweichen und Controller als getrennte Entitäten, um sie als vereinheitlichte Teile des Komponentenkonstrukts zu denken - dies ist einer der Hauptaspekte des mentalen Modells ng2.

Wenn wir so darüber nachdenken, erwarten wir natürlich, dass private Variablen in einer Komponentenklasse in ihrer Vorlage sichtbar sind, aus dem gleichen Grund erwarten wir, dass sie in den private Methoden für diese Klasse sichtbar sind.

+3

Zuerst dachte ich, genau wie du machst. Aber ich aktualisierte tslint zu 4.02 und codelyzer zu 2.0.0-beta.1, und ich hatte Fehler, die sagen, dass ich privat nicht verwenden kann, wenn ich auf Variablen in Ansicht zugreife. Also @ Yaroslavs Antwort scheint passender zu sein. – Maxime

+1

Ich hasse es, deine Antwort zu verwerfen, also werde ich es nicht tun. Aber ich hoffe, dass Sie @ Yaroslavs Antwort für das Lernen des Sackes beziehen können. – maxisam

+1

@maxisam ah, danke, dass du mich darauf aufmerksam gemacht hast - ich habe das schon lange nicht mehr gesehen. Hinweis hinzugefügt. – drewmoore

11

Auch wenn das Codebeispiel angibt, dass die Frage zu TypeScript gehört, ist das Tag nicht vorhanden. Angular2 ist auch für Dart verfügbar und dies ist ein bemerkenswerter Unterschied zu Dart.

In Dart die Vorlage privaten Variablen der Komponentenklasse nicht verweisen kann, weil Dart im Gegensatz effektiv Zugang von privaten Mitgliedern verhindert von außen nach Typoskript.

Ich noch zurück @drewmoores Vorschlag, über Komponente und seine Vorlage als eine Einheit zu denken.

Update (TS) Es scheint mit Offline-Kompilation Zugriff auf private Eigenschaften werden begrenzteren Angular2 TS wird auch https://github.com/angular/angular/issues/11422

+0

Sehr interessanter Punkt, froh, dass Sie darauf hingewiesen haben - ich kann mir vorstellen, dass das Verwirrung stiften könnte. – drewmoore

+0

Ist es möglich, Typoskript-Compiler zu haben, um private Variablen zu beschränken, die für die Ansicht zugänglich sind? –

+0

Ich weiß es nicht. Ich denke nicht. –

106

Nein, sollten Sie nicht private Variablen in Ihren Vorlagen werden.

Während ich die drewmoore's answer mag und perfekte konzeptionelle Logik darin sehe, ist es Implementierung falsch. Vorlagen existieren nicht innerhalb von Komponentenklassen, sondern außerhalb von ihnen. Werfen Sie einen Blick auf this repo für den Nachweis.

Der einzige Grund, warum es funktioniert, ist, weil TypeScript private Schlüsselwort nicht wirklich Mitglied privat macht.Just-in-Time-Kompilierung findet zur Laufzeit in einem Browser statt und JS hat (noch?) Kein Konzept von privaten Mitgliedern. Der Kredit geht an Sander Elias, um mich auf die richtige Spur zu bringen.

Mit ngc und Ahead-Time-Compilierung, erhalten Sie Fehler, wenn Sie versuchen, auf private Mitglieder der Komponente von Vorlage zuzugreifen. Clone Demo Repo, ändern MyComponent Mitglieder Sichtbarkeit auf private und Sie erhalten Kompilierungsfehler, wenn ngc ausgeführt wird. Hier ist auch answer spezifisch für Ahead-of-Time-Kompilierung.

+6

Dies ist der beste Kommentar und imo sollte die akzeptierte Antwort sein. Es ist nicht so, dass Sie private Variablen verwenden können, sobald sie übertragen wurden. Das sollten Sie tun. Halten Sie den Code sauber! –

+2

Dies ist die einzige gültige Antwort! Codelyzer warnt Sie jetzt, wenn Sie private var in Ihrer Vorlage verwenden. – Maxime

+0

Habe das einfach in unserer Code-Basis gesehen und einen Doppelklick gemacht. Danke für die Bestätigung, dass ich nicht den Verstand verliere :) –

2

Private Variablen können innerhalb der Vorlage der Komponente verwendet werden. Siehe angular2 Spickzettel für die Führung: https://angular.io/docs/ts/latest/cookbook/component-communication.html#!#parent-to-child-setter

Eine ausführlichere Erklärung über das öffentliche/private Mitglieder von Klassen in Typoskript hier gefunden werden kann: https://www.typescriptlang.org/docs/handbook/classes.html.

Alle Mitglieder sind standardmäßig öffentlich. Auf öffentliche Member kann von außerhalb der Komponentenklasse zusammen mit der Klasseninstanz zugegriffen werden. Aber auf private Mitglieder kann nur innerhalb der Klassenmitgliedsfunktionen zugegriffen werden.

Verwandte Themen