无法获得房产' map'未定义或空引用

时间:2016-06-08 04:10:08

标签: angular rxjs

我正在使用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);
}

0 个答案:

没有答案