typescript - Angular 4 "Egenskap finns inte på typ komponent"
Den senaste veckan har jag börjat lära mig Angular 4 och TypeScript, och jag har stött på mitt första hinder.
Jag försöker skapa en enkel datum- och tidskomponent. Från ett Javascript-perspektiv kan jag inte se något fel, men jag tror att jag inte arbetar med scope på det sätt som Angular vill, så jag söker lite vägledning. Felet är: Failed to compile very/long/file/path/date-time.component.ts (35,18): Property 'date' does not exist on type 'DateTimeComponent'.
Jag misstänker att jag inte placerar mina metoder på rätt ställe, eller att jag behöver deklarera mina egenskaper utanför setTime(). Allt råd uppskattas.
date-time.component.ts:
export class DateTimeComponent implements OnInit {
constructor() {
}
ngOnInit() {
this.setTime();
}
checkTime(i) {
return (i < 10) ? "0" + i : i;
}
setTime() {
let month = ["January", "February",
"March", "April",
"May", "June",
"July", "August",
"September", "October",
"November", "December"];
//date
let date: Date = new Date(); // this only accessible within setTime() method
let d: any = date.getDate();
let m: any = date.getMonth();
let y: any = date.getFullYear();
//time
let h: any = date.getHours();
let min: any = date.getMinutes();
let s: any = date.getSeconds();
let newMin: any = this.checkTime(this.min);
let newS: any = this.checkTime(this.s);
let myDate: any = d + " " + month[this.m] + " " + y;
let myTime: any = h + ":" + newMin + ":" + newS;
let t: any = setTimeout(() => {
startTime()
}, 500);
}
} //end of class
date-time.component.html:
<div ng-controller='TimeCtrl'>
<p>{{ myDate }}</p>
<p>{{ myTime }}</p>
</div>
Svar #1
Här är en plunker som visar din sak fungerande i en Angular-miljö. Detta är inte ett bra sätt att uppnå det du försöker göra.
Istället bör du göra något som denna bättre plunker som jag gjorde som faktiskt använder Angular till sin fulla potential.
Min version av din kod är ungefär 99% kortare och uppnår målet.
myDate: Date;
ngOnInit() {
this.myDate = new Date();
}
Med HTML
<p>{{ myDate | date:'d MMMM y'}}</p>
<p>{{ myDate | date:'hh:mm:ss'}}</p>
Svar #2
Anledningen till att du inte har deklarerat variabeln date i din komponent.
export class DateTimeComponent implements OnInit {
constructor() {
}
private date: Date; // This is accessible to this entire file
private month: string[];
private d: any;
private m: any;
private y: any;
private h: any;
private min: any;
private s: any;
private newMin: any;
private newS: any;
private myDate: any;
private myTime: any;
private t: any;
ngOnInit() {
}
checkTime(i) {
return (i < 10) ? "0" + i : i;
}
setTime() {
this.month = ["January", "February",
"March", "April",
"May", "June",
"July", "August",
"September", "October",
"November", "December"];
//date
this.date = new Date();
this.d = this.date.getDate();
this.m = this.date.getMonth();
this.y = this.date.getFullYear();
//time
this.h = this.date.getHours();
this.min = this.date.getMinutes();
this.s = this.date.getSeconds();
this.newMin = this.checkTime(this.min);
this.newS = this.checkTime(this.s);
this.myDate = this.d + " " + this.month[this.m] + " " + this.y;
this.myTime = this.h + ":" + this.newMin + ":" + this.newS;
this.t = setTimeout(() => {
startTime()
}, 500);
}
} //end of classexport class DateTimeComponent implements OnInit {
constructor() {
}
ngOnInit() {
}
checkTime(i) {
return (i < 10) ? "0" + i : i;
}
setTime() {
let month = ["January", "February",
"March", "April",
"May", "June",
"July", "August",
"September", "October",
"November", "December"];
//date
let date: Date = new Date(); // this only accessible within setTime() method
let d: any = date.getDate();
let m: any = date.getMonth();
let y: any = date.getFullYear();
//time
let h: any = date.getHours();
let min: any = date.getMinutes();
let s: any = date.getSeconds();
let newMin: any = this.checkTime(this.min);
let newS: any = this.checkTime(this.s);
let myDate: any = d + " " + month[this.m] + " " + y;
let myTime: any = h + ":" + newMin + ":" + newS;
let t: any = setTimeout(() => {
startTime()
}, 500);
}
} //end of classDet finns två tillvägagångssätt för detta, snippet 1 visar filövergripande deklaration, detta är vad du mestadels skulle använda i din app. Snippet 2 visar metod-baserad deklaration och den är endast tillgänglig för den metoden, vad gäller filer så existerar inte den variabeln.
private
Om du sätter private framför en variable eller method, kommer den endast att vara tillgänglig för .ts-filen (själv), inte ens HTML har tillgång till den.
