在Angular 2中为路由的通用组件提供异步依赖性.Route的解析等价

时间:2016-02-05 09:13:47

标签: javascript routing components angular

我想提供一组通用组件,因此他们不知道提供依赖项的服务。依赖这些组件是承诺。 换句话说,我想保持数据访问超出这些通用组件的范围。任何依赖项,尤其是要呈现的数据和组件配置都应该由声明组件的上下文提供给组件。 当我将 view 中的组件声明为DOM标记时,这很容易,例如:

<generic-component data="getSomeData()" configuration="componentConfig"></generic-component>

但是,当直接调用组件时,我如何处理?

我看过very similar issue,但问题的回答肯定不能让我满意。接受的答案建议将依赖项放入组件中,但这意味着丢失组件的通用方式。

在Angular 1方法中,使用路由声明的resolve属性。什么相当于Angular 2中Angular 1的解析?

请参阅mentioned question's示例,因为它非常准确。

2 个答案:

答案 0 :(得分:1)

RC 4中的Angular 2引入了Route的resolve属性。

此属性是具有实现Resolve接口的属性的对象。

每个解析器必须为@Injectable并且具有返回Observable | Promise | any的方法解析。

将ActivatedRoute作为route注入组件时您可以从route.snapshod.data ['someResolveKey']访问每个已解析的属性。

angular.io doc中的示例:

class Backend {
  fetchTeam(id: string) {
    return 'someTeam';
  }
}
@Injectable()
class TeamResolver implements Resolve<Team> {
  constructor(private backend: Backend) {}
  resolve(
    route: ActivatedRouteSnapshot,
    state: RouterStateSnapshot
  ): Observable<any>|Promise<any>|any {
    return this.backend.fetchTeam(route.params.id);
  }
}
@NgModule({
  imports: [
    RouterModule.forRoot([
      {
        path: 'team/:id',
        component: TeamCmp,
        resolve: {
          team: TeamResolver
        }
      }
    ])
  ],
  providers: [TeamResolver]
})
class AppModule {}

或者您也可以提供具有相同签名而不是类的函数。

@NgModule({
  imports: [
    RouterModule.forRoot([
      {
        path: 'team/:id',
        component: TeamCmp,
        resolve: {
          team: 'teamResolver'
        }
      }
    ])
  ],
  providers: [
    {
      provide: 'teamResolver',
      useValue: (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => 'team'
    }
  ]
})
class AppModule {}

您可以在组件中获取数据:

export class SomeComponent implements OnInit {
    resource : string;
    team : string;

    constructor(private route: ActivatedRoute) {
    }

    ngOnInit() {
        this.team = this.route.snapshot.data['team'];

        // UPDATE: ngOnInit will be fired once,
        // even If you use same component for different routes.
        // If You want to rebind data when You change route
        // You should not use snapshot but subscribe on
        // this.route.data or this.route.params eg.:
        this.route.params.subscribe((params: Params) => this.resource = params['resource']);
        this.route.data.subscribe((data: any) => this.team = data['team']);
    }

}

希望它有所帮助, 快乐的黑客!

答案 1 :(得分:0)

我遇到了完全相同的问题。

Route的专用组件将保留泛型组件可能是解决方案。但这并不优雅,而是旁路解决方案。