如何在Angular 7路由的Matcher函数中进行API调用

时间:2019-05-10 05:13:56

标签: angular typescript angular-routing angular-guards

我在Angular 7中具有路由匹配器功能,需要进行API调用以获取数组并检查该数组是否包含URL子弹

我尝试过的事情: 我在APP_INITIALIZER上调用了API,并将其保存在localStorage上,问题是我有没有localStorage的Angular Universal,也无法将任何服务注入Typescript类之外的函数中以使用CookieService或HttpClient服务。 尝试过使用Angular防护,但不知道如何在路由配置数组中跳至下一个对象,以防在类别数组中找不到URL的情况。

我现在所拥有的:

export function DealsMatcher(url: UrlSegment[]): UrlMatchResult {

    if (url.length === 0) {
        return null;
    }
    let categories: HeaderCategoriesModel[];
    // TODO: need to get categories from API
    const param = url[0].toString();
    const index = categories.findIndex(category => {
        return category.title_translit === param;
    });

    if (index !== -1) {
        return ({consumed: url, posParams: {slug: url[0]}});
    }

    return null;

}

const routes: Routes = [
    {
        path: ':slug',
        matcher: DealsMatcher,
        component: DealsComponent,
    },
    {
        path: ':slug',
        matcher: DealsDetailMatcher,
        component: DealsDetailComponent,
        resolve: {
            deal: DealsDetailResolve
        }
    }
]

我希望以某种方式将服务注入到DealsMatcher函数中,或者不进行注入就执行ajax请求。如果使用防角罩,也请跳至下一条路线检查。

1 个答案:

答案 0 :(得分:0)

启动应用程序时,我正在更改环境中的变量的值,并在匹配器函数中使用了此变量。

我从没使用过通用角度,不知道这样做是否会有问题

export function linuxMatcher(url: UrlSegment[]) {
  if (environment.linux) {
    return url.length === 1 && url[0].path.endsWith('firewall') ? { consumed: url } : null;
  }
  return null;
}