【问题标题】:How to make Route data typed in Angular 7 (in production)?如何在 Angular 7(生产中)中输入 Route 数据?
【发布时间】:2019-07-28 13:41:24
【问题描述】:
import { environment } from '@env/environment';

export const routes: Routes = [
  {
    path: '',
    children: [
      {
        path: 'organisations',
        component: OrganisationListComponent,
        data: {
          [environment.router.data.resourceName]: 'ORGANISATION' // <- error
        }
      },
      {
        path: 'organisations/create',
        component: OrganisationCreateComponent,
        data: {
          [environment.router.data.resourceName]: 'ORGANISATION_LIST' // <- error
        },...
      }

这是我的一个路由模块文件的一部分。如您所见,我希望路由数据具有我在环境文件中定义的名称的属性。但这在使用 --aot 标志编译时不起作用。这是错误:

ERROR in Error during template compile of 'AdminRoutingModule'
  Expression form not supported in 'routes'
    'routes' contains the error at app/admin/admin-routing.module.ts(30,11).

我的应用程序中有大约 30 条路由,它们都具有键为“resourceName”的数据属性。而且我不想在我的应用程序中重复这个字符串 30 次。

我无法创建具有 resourceName 属性的类并在数据中实例化它,因为在路由配置中也不允许使用函数表达式。

有没有办法解决这个问题,或者使用 AOT 编译器根本无法实现?

编辑:这是 environement.ts 文件:

export const environment = {
  production: true,
  version: '1.0.0',
  router: {
    data: {
      resourceName: 'resourceName'
    }
  }
}

【问题讨论】:

  • 它只是一个枚举。用'ORGANISATION' 替换ResourceName.ORGANISATION 并没有什么不同
  • 哦,确实,对不起,我看错了问题(我会删除我的评论)。
  • 如果您将“数据”对象移到路由之外会怎样。像这样的东西: const dat = {}; dat[environment.router.data.resourceName] = 'ORGANISATION';然后在这样的路由中使用它: data: dat
  • 还是一样的错误:(

标签: javascript angular typescript angular-aot


【解决方案1】:

使用函数,似乎可以解决这个尴尬的问题。

function mydata() {
    return {[environment.router.data.resourceName]: 'ORGANISATION'};
}

export const routes: Routes = [
  {
    path: '',
    resolve: [TranslateResolver],
    children: [
      {
        path: 'organisations',
        component: OrganisationListComponent,
        canActivate: [RouteGuard],
        data: mydata()
      },...

【讨论】:

  • 编译器说:Function expressions are not supported in decorators in 'routes'
  • 请在导出上方和导入下方尝试一个简单的功能。我怀疑这个问题可能类似于this issue
  • 还是同样的错误。我可以将函数传递给装饰器,但不能调用它
【解决方案2】:

我了解您试图将问题缩小为易于重现的问题,但也许您将其简化了太多。

这样,从您可以从编译器错误消息中读取的内容来看,这是不允许的(提供给 AOT 编译器的表达式,对象上的 [propertyName])。

我建议你完全避免这个问题,因为你可以有不同的环境文件,只需像这样定义数据:

export const environment = {
  production: true,
  version: '1.0.0',
  router: {
    data: {
      'resourceName': 'ORGANISATION', // <- replace 'resourceName' with whatever you need
    }
  }
}

然后像这样使用:

import { environment } from '@env/environment';

export const routes: Routes = [
  {
    path: '',
    resolve: [TranslateResolver],
    children: [
      {
        path: 'organisations',
        component: OrganisationListComponent,
        canActivate: [RouteGuard],
        data: environment.router.data,
      },...

如果你手头的问题需要别的东西,那么再次避免表达:

export const environment = {
  production: false,
  test: false,
  router: {
    data: {
      resourceName: 'resourceName', // <- replace 'resourceName' with whatever you need
    }
  },
};
export const environment = {
  production: true,
  version: '1.0.0',
  router: {
    data: {
      resourceName: environment.router.data.resourceName,
      value: 'ORGANIZATION',
    }
  }
}

这需要改变您使用这些数据的方式,但是,它确实有效。

【讨论】:

  • 问题是,我的应用程序中有大约 30 条路线。并且它们都具有带有键resourceName 的数据属性。我将此密钥添加到环境文件中,因此我不必重复相同的字符串 30 次。这样我仍然会重复它,只是在不同的地方。
  • 所以基本上,我的主要问题是无法输入路线数据。我无法创建具有resourceName 属性的类并在数据中实例化它,因为路由配置中也不允许函数表达式。
  • 我更新了问题,实在是太愚蠢了
【解决方案3】:

声明您自己的 Route 数据类型。从@angular/routerRoute 扩展,所以它都是类型安全的。这样,就可以断言 resourceName 属性的存在,否则甚至可以省略。

过程中无需涉及环境模块。

import { RouterModule, Route } from '@angular/router';

export interface MyRoute extends Route {
    data: {
        resourceName: string;
    };
}

export declare type MyRoutes = MyRoute[];

export const routes: MyRoutes = [
  {
    path: '',
    children: [
      {
        path: 'organisations',
        component: OrganisationListComponent,
        data: {
          resourceName: 'ORGANISATION'
        }
      },
      {
        path: 'organisations/create',
        component: OrganisationCreateComponent,
        data: {
          resourceName: 'ORGANISATION_LIST'
        },...
      }


【讨论】:

  • 我只需要编辑您的MyRoute 界面,使data 是可选的,并且还添加了children?: MyRoute[]
猜你喜欢
  • 2020-11-13
  • 2019-04-19
  • 1970-01-01
  • 1970-01-01
  • 2020-08-21
  • 2021-08-10
  • 1970-01-01
  • 2019-09-03
  • 1970-01-01
相关资源
最近更新 更多