2016-12-03 36 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