当前位置:  开发笔记 > 编程语言 > 正文

Angular2路由器和多个解析在一个路由中

如何解决《Angular2路由器和多个解析在一个路由中》经验,为你挑选了1个好方法。

在ui-router中,很容易在路由配置中定义多个解析,所以我们可以这样说:

export const APP_STATES: Ng2StateDeclaration[] = [
  {
    name: 'dashboard',
    url: '/dashboard', 
    component: DashboardComponent,
    resolve: [
      {
        token: 'playbookDurations',
        deps: [DashboardService],
        resolveFn: (svc: DashboardService) => svc.getPlaybookDurations()
      },
      {
        token: 'playbookSuccesses',
        deps: [DashboardService],
        resolveFn: (svc: DashboardService) => svc.getPlaybookSuccesses()
      },
      {
        token: 'playbookRuns',
        deps: [DashboardService],
        resolveFn: (svc: DashboardService) => svc.getPlaybookRuns()
      },
      {
        token: 'activityLog',
        deps: [DashboardService],
        resolveFn: (svc: DashboardService) => svc.getActivityLog()
      }
    ]
  }
}];

使用Angular2路由器时,需要为resolve参数实现解析器模式.所以像这样:

import { Resolve, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import { Injectable } from '@angular/core';
import { DashboardService } from '.';

@Injectable()
export class DashboardResolver implements Resolve {

  constructor(private dashboardService: DashboardService) { }

  resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
    return this.dashboardService.get();
  }

}

然后在我的路线中我做了类似的事情:

import { DashboardComponent } from './dashboard.component';
import { DashboardResolver } from './dashboard.resolver';

export const routes = [
  { 
    path: '', 
    children: [
      {
        path: '', 
        component: DashboardComponent,
        resolve: {
          data: DashboardResolver
        }
      }
    ]
  }
];

问题是只有一个决心.如何实现多个解析参数,如ui-router实现呢?

我想你有两个选择; 为每个输入实现解析器或让解析返回一个嵌套了所有解析的对象.第一个似乎非常礼仪,第二个听起来相当hacky所以必须有一个更好的方式.



1> AngularChef..:

好吧,我希望我没有误解这个问题.

Angular的路由器支持每条路由尽可能多的解析器.

在路由声明中,resolve属性是一个对象,它可以包含您想要的任意数量的键:

{
  path: '', 
  component: DashboardComponent,
  resolve: {
    foo: Resolver1
    bar: Resolver2,
    // more resolves here...
  }
}

然后从组件中检索已解析的数据:

@Component({ ... })
export class MyComponent {

  constructor(private route: ActivatedRoute) { }

  ngOnInit() {
    const foo = this.route.snapshot.data['foo'];
    const bar = this.route.snapshot.data['bar'];
  }

}

在所有结算完成/完成之前,路线不会被激活.


这是设计选择,由您决定。一个庞大的解析器将使其重用性降低。除非您的解析器绑定到一条特定的路线,否则我认为组成多个灵活的解析器是一种更好的方法。
所以这很好知道,但我不认为它完全回答了他的整个问题.我们是否必须为路由中的每个解析创建x个可注入的解析器类,或者我们如何制作一个在激活路由之前进行多个服务调用的解析器?
推荐阅读
和谐啄木鸟
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有