Angular ngOnInit上未定义角度2属性
我对使用AngularJs 2开发web还不熟悉,但我也没有使用AngularJs 1的经验。所以,如果我问了一些愚蠢的问题,我很抱歉。我被一个问题困住了,我用谷歌搜索了一下,但找不到任何解决办法/ 问题是: 我试图在ngOnInit结尾调用的函数中使用一个属性,该属性是我在ngOnInit上初始化的对象的属性,但该对象仍然是未定义的,因此我得到以下异常:Angular ngOnInit上未定义角度2属性,angular,typescript,Angular,Typescript,我对使用AngularJs 2开发web还不熟悉,但我也没有使用AngularJs 1的经验。所以,如果我问了一些愚蠢的问题,我很抱歉。我被一个问题困住了,我用谷歌搜索了一下,但找不到任何解决办法/ 问题是: 我试图在ngOnInit结尾调用的函数中使用一个属性,该属性是我在ngOnInit上初始化的对象的属性,但该对象仍然是未定义的,因此我得到以下异常: Error: Uncaught (in p**strong text**romise): TypeError: Cannot read pr
Error: Uncaught (in p**strong text**romise): TypeError: Cannot read property 'secretariatId' of undefined
以下是我的组件:
import {Component, OnInit, AfterViewChecked} from '@angular/core';
import { ActivatedRoute, Router, Params } from '@angular/router';
import {StudentService} from './services/student.service';
import {Student} from './services/student';
import {SecretariatService} from './services/secretariat.service';
import {DisciplineService} from './services/discipline.service';
import {Discipline} from './services/discipline';
@Component({
selector: 'fountain-enrollstudent',
template: require('./templates/enrollstudent.component.html')
})
export class EnrollStudentComponent implements OnInit, AfterViewChecked {
public text: string;
selectedDiscipline: Discipline;
disciplines: Discipline[];
student: Student;
constructor(
private disciplineService: DisciplineService,
private studentService: StudentService,
private secretariatService: SecretariatService,
private router: Router,
private route: ActivatedRoute
) {
this.text = 'My brand new component!';
}
ngOnInit(): void {
this.route.params.forEach((params: Params) => {
console.log(params);
let id = +params['id'];
this.getStudent(id);
console.log(id);
console.log(this.student);
this.getDisciplines(this.student.secretariatId);
});
console.log(this.student);
}
// Understand the best moment to call it. Ps.: It doesn't work on ngOnInit
getDisciplines(secretariatId: number): void {
this.disciplineService.getDisciplinesBy(secretariatId)
.then(disciplines => this.disciplines = disciplines);
}
getStudent(id: number): void {
this.studentService.getStudent(id)
.then(student => this.student = student);
}
onSelect(discipline: Discipline): void {
this.selectedDiscipline = discipline;
}
}
这是我的模板:
<div class="text-center">
<h4>Disciplines:</h4>
<ul class="list-unstyled">
<li *ngFor="let discipline of disciplines" (click)="onSelect(discipline)" [class.selected]="discipline === selectedDiscipline">
<h4>
<a>{{discipline?.name}}</a>
</h4>
</li>
</ul>
</div>
学科:
-
{{学科?.name}
以下是纪律服务:
import { Injectable } from '@angular/core';
import { Discipline } from './discipline';
import { DISCIPLINES } from './mock-disciplines';
@Injectable()
export class DisciplineService {
getDisciplines(): Promise<Discipline[]> {
return Promise.resolve(DISCIPLINES);
}
getDisciplinesBy(secretariatId: number): Promise<Discipline[]> {
return this.getDisciplines()
.then(disciplines => disciplines.filter(discipline => discipline.secretariatId === secretariatId));
}
}
从'@angular/core'导入{Injectable};
从“./规程”导入{规程};
从“./mock disciplies”导入{prociplies};
@可注射()
出口级纪律服务{
getpromise():承诺{
回报承诺。解决(纪律);
}
GetDistrictionsby(秘书:编号):承诺{
返回此值。getDistrictions()
.then(规程=>规程.filter(规程=>规程.secretaritid===secretaritid));
}
}
我正在寻找另一个生命周期钩子来调用函数getStrictures(id:number),但我尝试了所有这些,但没有得到好的结果/
提前谢谢 您需要链接异步调用:
ngOnInit(): void {
this.route.params.forEach((params: Params) => {
console.log(params);
let id = +params['id'];
// vvvvvvvv use `.then(...)`
this.getStudent(id).then(student => {
console.log(id);
console.log(this.student);
this.getDisciplines(this.student.secretariatId);
});
}
}
getStudent(id: number): void {
// vvvvvvvv return the promise so callers can chain their code
return this.studentService.getStudent(id)
.then(student => this.student = student);
}