2016-12-03 95 views
1

我的應用程序設置爲在頂部點擊鏈接時過濾不同的項目。這通過接收一個路由參數並將其傳遞給我的組件完成。我的組件然後根據提供的參數篩選數據庫查詢OnInit。這一切都很好,但我遇到的問題是,當我在子路由之間移動時,ngOnInit並未被解僱。ngOnInit不發射兒童路線之間的一個變化

ngDoCheck似乎是我需要使用的東西,但是當應用程序正在加載並且因爲projectService未完成而破壞我的代碼時,它會被解僱。有沒有辦法強制ngDoCheck等到項目加載之後纔開始監聽? Angular網站表示它應該已經這樣做了,但是從我所看到的不是。

任何意見我應該如何正確實施這個?

組件

ngOnInit() { 
    this.paramsSub = this.activatedRoute.params.subscribe(params => this.pageCategory = params['id']); 
    this.getProjects(); 
    } 

    getProjects() { 
    if (this.pageCategory) { 
     this.projectService.getProjects() 
     .subscribe(
     projects => this.projects = projects.filter(project => project.category.includes(this.pageCategory)), 
     error => this.errorMessage = <any>error); 
    } else { 
     this.projectService.getProjects() 
     .subscribe(
     projects => this.projects = projects, 
     error => this.errorMessage = <any>error); 
    } 
    } 

路線

const routes: Routes = [ 
    { path: '', 
    children: [{ 
     path: ':id', 
     component: HomeComponent, 
    }] 
    }, 
    { path: '', component: HomeComponent }, 
    { path: '**', redirectTo: '', pathMatch: 'full' } 
]; 

回答

2

爲什麼ngOnInit不叫問題是因爲角度是聰明重新初始化組件。訣竅是你的兩條路線都加載了同一個組件(HomeComponent),而Angular看到了這一點,並且現在看到了它爲什麼應該銷燬前一個的原因,但是改變這個組件的參數會更好,在這種情況下,它是組件的輸入)。所以這個lifecyclehook「ngOnChanges」是在組件的輸入發生改變時調用的。你應該聽這個,並且在裏面叫this.getProjects(),因爲我認爲你正在改變服務內部的狀態。

但我認爲你的問題有點不同。 this.getProjects()應該在this.activatedRoute.params.subscribe處理程序中調用,因爲沒有人調用this.getProjects,除了onInit掛鉤,當調用pageCategory時仍然未將其分配給當前路由,因爲訂閱後來因爲其異步。 您需要訂閱處理程序才能撥打this.getProjects

希望我幫你澄清了一些東西

+0

謝謝!我能夠把你的話說出來並弄清楚。我仍然從OnInit調用所有的東西。 OhChanges似乎殺了我的查詢請求並且什麼也沒有返回。 – Jleibham

+0

你是怎麼做到的? – chrismarx