子模块中的 RouteReuseStrategy

2024-01-31

这是我的延迟加载子模块:

@NgModule({
  imports: [
    CommonModule,
    RouterModule.forChild(acnpRoutes),
    ....
  ],
  declarations: [...],
  providers: [
    {provide: RouteReuseStrategy, useClass: ACNPReuseStrategy}
  ]
})
export class AddCustomerNaturalPersonModule {
}

routes:

const acnpRoutes: Routes = [
  {
    path: '',
    component: AddCustomerNaturalPersonComponent,
    children: [
      {
        path: 'stepOne',
        component: ACNPStepOneComponent
      },
      {
        path: 'stepTwo',
        component: ACNPStepTwoComponent
      },
    ]
  }
]

和 ACPNReuseStrategy:

export class ACNPReuseStrategy implements RouteReuseStrategy {
  handlers: {[key: string]: DetachedRouteHandle} = {}

  shouldDetach(route: ActivatedRouteSnapshot): boolean  {
    console.log(1)
    return true;
  }

  store(route: ActivatedRouteSnapshot, handle: {}): void {
    console.log(2)
  }

  ...

  shouldReuseRoute(future: ActivatedRouteSnapshot, curr: ActivatedRouteSnapshot): boolean {
    console.log(5)
  }
}

不幸的是,ACNPReuseStrategy 方法中的这些 console.logs 都没有被触发。这是为什么?延迟加载模块中可以重用组件吗?


TL;DR提供您的RouteReuseStrategy在主模块而不是子模块中(app.module.ts默认情况下)。然后,为每条路线分配一个key in route.data使您的路线与众不同。


我最近也遇到了这个问题。我的子模块安装在主应用程序路由下,如下所示:

..., {    // in app.route.ts
          path: 'apimarket',
          canActivate: [DeveloperResolve],
          loadChildren: './apimarket/apimarket.module#ApiMarketModule'
}

如果我提供我的定制RouteReuseStrategy在子模块中ApiMarketModule, the RouteReuseStrategy永远不会被建造。

解决方案是在主模块而不是子模块中提供策略(app.module.ts就我而言)。那么你的RouteReuseStrategy将被正确构建。

然而,由于以下原因,该策略不会按预期发挥作用:route.routeConfig.path由于您的子路线,因此是相对路径。为了解决这个问题,我的解决方案是分配一个唯一的key我的路线是这样的:

export const apimarketRoutes: Routes = [
    {
        path: '',
        component: ApiMarketComponent,
        data: {
            shouldReuse: true,
            key: 'apimarketroot'
        }
    },
    {
        path: ':id',
        component: ContentPageComponent,
    }
];

这是我的RouteReuseStrategy实施前两年

export class MyRouteReuseStrategy implements RouteReuseStrategy {
  handlers: {[key: string]: DetachedRouteHandle} = {};

  constructor() {
    console.log('constructed');
  }

  retrieve(route: ActivatedRouteSnapshot): DetachedRouteHandle {
    if (!route.data['shouldReuse']) {
      return null;
    }
    console.log('Attach cached page for: ', route.data['key']);
    return this.handlers[route.data['key']];
  }

  store(route: ActivatedRouteSnapshot, handle: DetachedRouteHandle): void {
    if (route.data['shouldReuse']) {
      this.handlers[route.data['key']] = handle;
    }
  }

  shouldDetach(route: ActivatedRouteSnapshot): boolean {
    return !!route.data['shouldReuse'];
  }

  shouldAttach(route: ActivatedRouteSnapshot): boolean {
    return !!route.data['shouldReuse'] && !!this.handlers[route.data['key']];
  }

  shouldReuseRoute(future: ActivatedRouteSnapshot, current: ActivatedRouteSnapshot): boolean {
    return !!future.data['shouldReuse'];
  }
}

(RouteReuseStrategy没有很好的记录,由于策略在根级别上工作,我的解决方案可能存在潜在的性能问题。欢迎讨论:))

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

子模块中的 RouteReuseStrategy 的相关文章

  • Angular2 http.post 被执行两次

    我遇到一个奇怪的问题 Angular2 的 RC1 Http 服务执行 http post 调用两次 我已经调试了我的应用程序 并且我知道这不是点击事件问题 导致核心服务调用的所有调用 public create json Object p
  • 如何在 Angularfire2 Angular2 中对 FirebaseListObservable 列表进行排序?

    我想从 Firebase 实时数据库中获取所有用户 并按分数属性对它们进行排序 我已经使用变量来完成这个工作 users FirebaseListObservable
  • crypto.randomBytes 不是 Angular 中的函数

    我正在进口ethereumjs 钱包 https github com ethereumjs ethereumjs wallet在角度4中 import EthereumWallet from ethereumjs wallet var w
  • Angular 拦截器排除特定 url

    我正在编写拦截器 这样我就不必处理调用我的 Web api 的每个服务中的标头 问题在于 我的 99 的调用需要 1 个特定的标头集 但其他 1 只需要 1 个标头 并且无法与其他存在的标头一起使用 知道这一点后 我的想法是制作 2 个拦截
  • Primeng - 无法在列中显示数组项

    我在 Angular 2 中使用 primeng 数据表 我的模型是一个数组products 每个产品都有一系列locations 该位置数组有一个属性name 如何显示每个name一行中的位置数组product 示例 如果首先produc
  • 无法使用 API 获取的数据初始化 ngx-charts

    我在尝试初始化使用构建的图表时遇到了一些困难ngx 图表 https github com swimlane ngx charts使用API 获取数据 我构建了一个 REST API 在正确调用后 它会输出一些时间序列数据 prices i
  • 可观察的重试 / retryWhen 与平面地图

    我有以下代码来获取 id 以及与 id 相关的数据 process Observable
  • ZF2 路由与 ZF1 相同

    如何使路由自动适用于 ZF1 结构中的所有内容 模块 控制器 操作 par1Name par1Val par2Name par2Val 我阅读了有关路由的信息 但在我看来 我必须手动添加所有操作 并且我发现可选参数存在问题 您可以至少在每个
  • Angular 6+ 应用程序的运行时配置

    在 Angular 应用程序运行时加载环境特定配置的推荐最佳实践是什么 Angular 文档提到了 APP INITIALIZER 的使用 但对于使用 forRoot 约定的导入模块的运行时配置等加载过程来说 这仍然还不够早 在我的用例中
  • 自定义收集路径的polymorphic_path

    我有以下路线定义 resources documents do collection do post filter end end 以及以下模型结构 class Document lt ActiveRecord Base belongs t
  • 更新到 Angular 6 和 rxjs 6 后 Plunker 损坏

    我有一个Plunker 中的 Angular 应用程序 https embed plnkr co 1dAIGrGqbcfrNVqs4WwW 自从我升级我的应用程序以使用 Angular 6 和 rxjs 6 以来 它不再起作用 这是我的co
  • 如何对这种效果进行单元测试(使用 {dispatch: false})?

    ngrx 和单元测试初学者在这里 我有如下效果 Injectable export class NotificationEffects Effect dispatch false notificationShow this actions
  • Angular2 CORS 问题

    我是 angular2 的新手 公平地说 我对尝试修复的知识知之甚少 但是我遇到了一些有关跨站点请求的问题 试图从另一个应用程序访问服务 但无论我尝试什么 我都会遇到这个问题去做 XMLHttpRequest cannot load htt
  • NS-2.34 DYMO 贴片

    我正在尝试将 DYMO 路由协议添加到 NS 2 34 但它不起作用 我正在关注这个教程 https khaledben wordpress com 2011 04 16 patching dymo um in ns 2 https kha
  • Angular 5在另一个变量更改时自动更新字符串变量

    当另一个变量发生变化时 有没有办法更新字符串变量 我有一个使用各种变量构建的字符串 我使用插值在组件的 html 文件中显示该字符串 但是 如果变量更改了字符串用于构建自身的变量 则该字符串将永远不会更改 因为它们不可变 唯一的方法是当其他
  • GET 和 POST 方法的单独 Flask 路由

    在 Flask 中定义路由时 最好的做法是使用由多个 HTTP 方法定义的单个路由 并在该单个路由中使用显式逻辑处理不同的 HTTP 方法 例如 app route api users methods GET POST def users
  • 添加滚动到顶部按钮(Ionic 2 | Typescript)

    大家好 我正在尝试添加 滚动到顶部按钮 实现以下内容 1 当用户向下滚动时显示按钮 2 当用户向上滚动时隐藏按钮 3 如果点击该按钮 则滚动到顶部并隐藏该按钮 关于如何使其正确的任何建议 多谢 简化scrollToTop from adri
  • 不允许我将对象推入数组

    我正在使用 Angular 我试图将一个对象推入数组 但它给了我错误 它说类型错误 无法读取未定义的属性 push 也就是下面的代码 文章是一个对象 articles Article addArticle newTitle HTMLInpu
  • 在 mat-table 父级中使用 ngif 时,mat-filtering/mat-sort 无法正常工作

    请注意 分页 排序无法正常工作 分页不显示它所显示的元素数量 并且排序不起作用 但是如果删除 html 文件中的行 ngIf dataSource filteredData length gt 0 错误已修复 如果使用过滤 它可以工作 但不
  • Angular 2:将路由器出口设计为宽度 < 100%

    我正在构建一个 Angular 2 应用程序 该应用程序将为宽度超过 500 的屏幕提供侧导航栏 为宽度小于 500 的屏幕提供底部导航栏 现在 我尝试为侧栏分配 20 的宽度 即 80 应用内容 我遇到的问题是路由器出口内容 即实际的应用

随机推荐

  • 如何使用 Liferay Tomcat 减少部署时间

    我使用 Liferay 6 并结合 Struts2 我正在使用 Liferay Bundled Tomcat 7 它工作正常 我的问题是 每当资源 portlet xml 或 java 文件 发生更改以及单击 build xml 时 部署都
  • 我可以在 Visual Studio 中的代码块注释中添加链接吗?

    我可以在 Visual Studio 中的代码块注释中添加链接吗 例如 block 1 class class1 block 2 class class2 review class1 1 类 是 1 类的链接 提前致谢 You can bo
  • 如何知道我的代码在 IDE 中以“调试”模式运行?

    如何编写在 调试 模式下 例如在 Eclipse 中作为 调试为 Java 应用程序 调用 与在 运行 模式下 例如在 Eclipse 中作为 作为 Java 应用程序运行 调用 下运行时行为不同的代码 也就是说 例如 代码可以在 作为 J
  • React 路由器中的动态路径

    我正在尝试将我的网站从传统的网络应用程序方法迁移到基于反应的应用程序 在此过程中 我遇到了与网址相关的问题 在我的网站中 在服务器端我使用网址重写将 url 映射到正确的控制器的功能 但我无法弄清楚如何在反应路由器中处理这个事情 我当前的反
  • 在 ubuntu 上编译 C 代码时遇到问题。 (#包括错误)

    我正在尝试在最新版本的ubuntu上编译C程序 以便稍后将编译后的程序放在另一台机器上 但是 当我使用 gcc prog c o prog 编译时 出现错误 致命错误 asm page h 没有这样的文件或目录 以下是标题 include
  • 隐藏微调器中的第一个项目

    我在微调器上工作 微调器中有 5 个项目 我只想隐藏微调器中的第一个项目 不是删除 只是隐藏 问题是 当我单击微调器时 没有选择 api 获取的项目通过使用第一个 item id 我刚刚在微调器的第一个位置 0 处添加了空白字段 它工作正常
  • 如何在 PHP 中将“一周的第一天”设置为星期四

    我想将一周的第一天设置为星期四 而不是星期日或星期一 因为这是公司的截止日期 我已经有一个代码来确定日期的当前周数 但它从星期日或星期一开始 如何根据我的喜好修改这些 function findweek date monthstart da
  • 使用 Jasmine 监视可观察订阅的结果

    我正在 Jasmine 单元测试一个使用 Observables 的角度组件 我的组件有我正在测试的生命周期挂钩 ngOnInit this dataService getCellOEE this cell subscribe value
  • 如何在 Jest 单元测试中查看渲染的 React 组件是什么样子?

    我正在尝试对 React 组件进行测试 我需要检查渲染后的样子 尝试使用ReactDOMServer renderToString 但它失败了 这是代码 import NewRec from src components edit impo
  • sqlSave 错误

    我正在与sqlSave添加我的矩阵B看起来像这样 Noinscr 88877799 45645687 23523521 45454545 到 SQL 表 所以我运行以下命令 sqlSave channel b testsFelix dbo
  • C++ Windows 异步 IO 命名管道未收到第一条消息

    修改后的代码来自 使用重叠 I O 的命名管道服务器https msdn microsoft com en us library windows desktop aa365603 v vs 85 aspx https msdn micros
  • Swift 3:使用 NSCoder 解码值的安全方法?

    在 Swift 3 之前 您可以使用 NSCoder 解码布尔值 如下所示 if let value aDecoder decodeObjectForKey TestKey as Bool test value Swift 3 中建议的方法
  • 多个定义和仅标头库

    我有一个带有几个 c 和 h 文件的 C 程序 我决定将程序的一部分设为 仅标头 因此我将代码从 c 移至 h 现在我遇到了多重定义问题 但我不知道为什么 例如 main c includes utils h vector c includ
  • iOS 13 中的 viewDidAppear 问题

    我刚刚开始使用 iOS 13 进行编码 并且遇到了视图控制器功能的问题 在 iOS 13 之前 我有一个使用此函数呈现的视图控制器 func presentDetail viewControllerToPresent UIViewContr
  • 为什么magento不自动加载父类

    我有一个模块 它将使用我的控制器而不是magento的控制器
  • 日期/时间点/间隔的(关系)数据库性能

    我正在使用 Access SQL 做一个项目 并且进展顺利 我学到了很多关于 Access 和 VBA 的知识 这个网站在这个过程中给了我很大的帮助 现在我面临着一个性能问题 由于我在这种 SQL 工作方面经验很少 所以我来这里是为了一些想
  • 奇怪的乘法结果

    在我的代码中 我在 C 代码中进行了乘法运算 所有变量类型均为 double f1 0 f1 rot 0 xu 0 f1 rot 1 yu 0 f1 1 f1 rot 0 xu 1 f1 rot 1 yu 1 f1 2 f1 rot 0 x
  • C# 表单激活和停用事件

    我有两个表单 主表单和子表单 当 mainForm 失去焦点时 我希望 subForm 消失 然后在 mainForm 重新获得焦点时重新出现 我在 mainForm 上使用 Activated 和 Deactivate 事件来跟踪 mai
  • h2内存表,远程连接

    我在创建内存表 使用 H2 数据库以及在创建和运行该表的 JVM 之外访问它时遇到问题 该文档将 url 构造为jdbc h2 tcp
  • 子模块中的 RouteReuseStrategy

    这是我的延迟加载子模块 NgModule imports CommonModule RouterModule forChild acnpRoutes declarations providers provide RouteReuseStra