我正在使用Angular2撰写强制性博客网站。我的网站有一个BlogIndex组件和一个BlogService,如下所示。 第一次加载BlogIndex它工作正常。但是,如果我尝试导航到不同的组件,我的应用程序崩溃并显示如下所示的错误消息。
当我尝试离开BlogIndex时,会触发BlogIndex.ngOnDestroy。执行导航组件的ngOnInit。
当我尝试离开时,不会再次调用BlogIndex.updateIndex ...但是如果我删除方法中的代码行,我的应用程序就不会崩溃。
错误讯息:
Unable to get property 'map' of undefined or null reference
堆栈追踪:
TypeError: Unable to get property 'map' of undefined or null reference
at Tree.prototype.pathFromRoot (eval code:30:50)
at _findUrlSegment (eval code:79:5)
at _findStartingNode (eval code:90:9)
at link (eval code:14:5)
at Router.prototype.createUrlTree (eval code:133:9)
at RouterLink.prototype._updateTargetUrlAndHref (eval code:42:9)
at Anonymous function (eval code:17:81)
at Anonymous function (eval code:122:87)
at ZoneDelegate.prototype.invokeTask (http://localhost:61560/lib/zone.js/dist/zone.js:354:18)
at onInvokeTask (eval code:36:25)
App崩溃了(我不确定这是什么)
SafeSubscriber.prototype.__tryOrUnsub = function (fn, value) {
try {
fn.call(this._context, value);
}
catch (err) {
this.unsubscribe();
throw err; // crashes here
}
};
BlogIndex.ts(删除了一些代码)
export class BlogIndex implements OnInit, OnDestroy {
constructor(private blogService: BlogService, private sessionService: SessionService) {
this.ImageRoot = sessionService.ImageRoot;
}
ngOnInit()
{
this.updateIndex();
}
ngOnDestroy()
{
}
updateIndex()
{
// this line causes the error
this.blogService.GetContentItems(this.sessionService.CurrentSite.ID, this.sessionService.CurrentMenuID, this.sessionService.CurrentGroupID)
.subscribe((x: ContentItem[]) => {
this.ContentItems = x;
});
}
}
BlogService.ts(删除了一些代码)
@Injectable()
export class BlogService {
private serviceURL: string;
constructor(private http: Http) {
}
GetContentItems(siteID: number, menuID: number, groupID: number): Observable<ContentItem[]> {
let url = this.serviceURL + 'GetContentItems?siteID=' + siteID.toString() + '&menuID=' + menuID.toString() + '&groupID=' + groupID;
return this.http.get(url)
.map(response => this.extractData(response))
.catch(this.handleError);
}
private extractData(res: Response) {
if (res.status < 200 || res.status >= 300) {
throw new Error('Bad response status: ' + res.status);
}
let body = res.json();
return body || [];
}
private handleError(error: any) {
let errorMsg = error.message || 'Server error';
console.error(errorMsg);
return Observable.throw(errorMsg);
}
}
*注意:我在本周早些时候发布了一条带有同样错误消息的问题。我包含了我认为是错误来源的代码但是它不正确。我已经确定了上面标出的有问题的代码行。
更新
我更改了我的组件和服务以使用promise而不是observable,我得到完全相同的错误:
BlogIndex:
this.blogService.GetContentItems(this.sessionService.CurrentSite.ID, this.sessionService.CurrentMenuID, this.sessionService.CurrentGroupID)
.then((x: ContentItem[]) => {
this.ContentItems = x;
});
BlogService:
GetContentItems(siteID: number, menuID: number, groupID: number): Promise<ContentItem[]> {
let url = this.serviceURL + 'GetContentItems?siteID=' + siteID.toString() + '&menuID=' + menuID.toString() + '&groupID=' + groupID;
return this.http.get(url).toPromise()
.then(response => this.extractData(response))
.catch(this.handleError);
}