Angular 2: не удается найти ngOnInit/ngOnDestroy
ПРИМЕЧАНИЕ: я обнаружил, что статья не может найти OnInit в машинописном тексте во время реализации, но код ниже уже импортирует OnInit/ OnDestroy.
Все примеры, которые я нашел (например, " Использование параметров маршрута"), указывают на добавление предложения "Implements OnInit, OnDestroy" к определению класса и включение методов ngOnInit/ngOnDestroy при подписке для получения параметра из маршрута, которым является код делает.
Однако VS2017 сообщает об ошибке "неправильно реализует OnInit/OnDestroy" для этого предложения и сообщает об ошибке "Не удается найти ngOnInit/ngOnDestroy" для функций.
Если я удалю предложение 'Implements' и прокомментирую функции ngOnInit/ngOnDestroy (оставляя только код в теле ngOnInit), код работает; он успешно получает параметр из параметров маршрута.
import { Component, Inject, OnInit, OnDestroy } from '@angular/core';
import { Http } from '@angular/http';
import { ActivatedRoute } from '@angular/router';
@Component({
selector: 'submission',
templateUrl: './submission.component.html'
})
export class SubmissionComponent implements OnInit, OnDestroy {
private baseUrl: string;
private http: Http;
private route: ActivatedRoute;
private sub: any;
public caseId: string;
public submission: Submission;
constructor(http: Http, route: ActivatedRoute, @Inject('BASE_URL') baseUrl: string) {
this.http = http;
this.route = route;
this.baseUrl = baseUrl;
ngOnInit() {
this.sub = this.route.params.subscribe(params => {
this.caseId = params['caseId'];
// In a real app: dispatch action to load the details here.
});
}
ngOnDestroy() {
this.sub.unsubscribe();
}
this.get(this.caseId);
}
public get(caseId: string) {
var url = this.baseUrl + 'api/Submission/GetSubmission?caseId=' + caseId;
this.http.get(url).subscribe(result => {
this.submission = result.json() as Submission;
}, error => console.error(error));
}
public put() {
var url = this.baseUrl + 'api/Submission/PutSubmission';
this.http.put(url, this.submission).subscribe(result => {
this.submission = result.json() as Submission;
}, error => console.error(error));
}
}
2 ответа
Методы ngOnInit
а также ngOnDestroy
должен быть за пределами конструктора. Как это:
// imports ...
@Component({
// ...
})
export class SubmissionComponent implements OnInit, OnDestroy {
// ...
constructor( /* ... */ ) {
// ...
}
ngOnInit() {
// ...
}
ngOnDestroy() {
// ...
}
}
Я могу видеть из вашего кода, что ngOnInit и ngOnDestroy находятся внутри конструктора, поэтому, если вы берете его снаружи, все будет в порядке.
Пример кода:
constructor(http: Http, route: ActivatedRoute, @Inject('BASE_URL') baseUrl: string) {
this.http = http;
this.route = route;
this.baseUrl = baseUrl;
}
ngOnInit() {
this.sub = this.route.params.subscribe(params => {
this.caseId = params['caseId'];
this.get(this.caseId);
// In a real app: dispatch action to load the details here.
});
}
ngOnDestroy() {
this.sub.unsubscribe();
}
Как правило, при добавлении ngOnInit и ngOnDestroy вы всегда должны проверять эти шаги:
- Убедитесь, что вы импортировали OnInit и OnDestroy из "angular/core"
- Затем добавьте их в класс
Добавьте эти функции
import { OnInit, OnDestroy } from '@angular/core'; export class ComponentComponent implements OnInit, OnDestroy { ngOnInit(){} ngOnDestroy(){} }