Wie funktioniert die Deklaration von Variablen unterscheiden sich zwischen den `Klassen` und `constructor`?
Habe ich ein Beispiel gesehen, und ich bin versucht ihn zu reproduzieren. Die name
und age
deklariert sind innerhalb der class
und services
( Injizierbaren ) Hinzugefügt, in der constructor
.
Ich würde gerne wissen, der Unterschied zwischen deklarieren von Variablen mit class
und constructor
hier. Alle mir einer helfen, zu wissen, die Unterschiede.
Als auch anstelle der Deklaration der name
und age
kann ich nicht erklären Innenseite des constructor
selbst?
hier ist mein code :
import {Component} from 'angular2/core';
import {CommonService} from './commonService';
import {commonServiceIndipendent} from './commonSerivceIndipendent';
@Component({
selector : 'component1',
template : `
<h1>Component 1</h1>
<input type="text" #message />
<button (click)="onLog(message.value)" >Component1 - Message </button>
`,
providers:[commonServiceIndipendent]
})
export class Component1 {
name:string; //why here?
age:number; //why here?
//can't i add to constructor? if so how?
constructor (
private _commonService : CommonService,
private _commonServiceIndipendent:commonServiceIndipendent) {}
//sending to same service. it has other instance in history
onLog(message:string) {
this._commonService.log( message );
this.name = "Arif",
this.age = 20;
this.onData();
}
onData() {
this._commonServiceIndipendent.myData(this.name,this.age);
}
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
in diesem Fall
ist ähnlich wie diese
wenn Sie nicht im Konstruktor
protected
,private
oderpublic
zum Beispiel DI, den Bereich der Variablen_commonService
ist der Umfang der Konstruktor{ }
Sie nicht verwenden konnten, aus einer anderen Funktion.Beispiel:
Wenn Sie nicht zuordnen, um eine andere variable hat den Gültigkeitsbereich der Klasse,so dass Sie keine Bezugnahme auf diese variable, mit
this
Stichwort.in Maschinenschrift ohne Angular2, Sie können dies tun, mit nichts mehr:
aber in Typoskript mit Angular2, Angular2 verantwortlich ist, die meisten der Zeit, zum nutzen für DI stehen im Beispiel hier:
dafür
providers:[commonServiceIndipendent]
.Angular2: Injizieren Sie eine nicht @Injizierbaren Klasse
Wie Dependency Injection (DI) korrekt in Angular2?
Wenn Sie delcare ein Feld außerhalb des Konstruktors ist es für tools, die statische Analyse, wie ein linter oder Autovervollständigung.
Wenn Sie Felder hinzufügen im Konstruktor, solche tools brauchen würde, den code zu analysieren flow (könnte es
if
,for
, ...) in den Konstruktor, und es könnte abhängen auf Konstruktor-Parameter, wenn Felder erstellt werden, oder nicht. Dies macht es ziemlich schwierig und ist in der Regel nicht unterstützt.Deklarieren der Felder außerhalb des Konstruktors ist für einen statischen Ansatz wie in Programmiersprachen, die kompiliert werden. Erstellen Sie im Konstruktor einen dynamischen Ansatz in der Regel nicht in kompilierte Sprachen.
Wenn es nur für die Initialisierung der Felder mit Literalwerten es ist auch übersichtlicher. Sie oft kann nicht einmal einen Konstruktor an alle.
Gibt es auch eine andere Möglichkeit mit einem Konstruktor
das schafft auch ein
private
Feld (könnte auchpublic
). Auf diese Weise macht auch das Feld, bekannt für die statische Analyse, da das Feld erstellt ist bedingungslos (nicht angewiesen auf Werte, die erst zur Laufzeit bekannt)Als Variablen definiert sind, Sie sind Mitglieder der
Component1
Klasse und jede Instanz derComponent1
Klasse hat einename
und einage
öffentliche Mitglieder bzw.string
undnumber
Arten.Nach dem Typoskript ist transpiled, gibt es keinen Unterschied, ob Sie deklarieren Sie in der
constructor
oder als Mitglieder. Bevor es transpiled Sie haben jedoch Zugang zu diesen Mitgliedern, die von Instanzen dieser Klasse. Dadurch können Sie Fehler sehen, während Sie sind noch in der Entwicklung, wie zum Beispiel versuchen, dieage
einerComponent1
auf etwas anderes aus einemnumber
.Der Unterschied kommt, wenn Sie eine Klasse definieren, Mitglied zu werden private. Dann es ist der Unterschied nach dem transpilation.
Hier einige docs auf TS-Klassen.