在 Angular 2 中激活路由*之前*解析值

2024-02-21

只要承诺尚未解决,我就想阻止访问路线。另外,我想将该承诺的返回值传递给路由组件。

Several https://stackoverflow.com/questions/36260780/angular-2-resolve-root-component-before-instantiating-child-components posts https://stackoverflow.com/questions/34734367/angular-2-router-resolve-server-request-before-opening-a-component所以建议使用OnActivate为此的接口。这文档 https://angular.io/docs/ts/latest/api/router/OnActivate-interface.html说:“如果routerOnActivate返回一个承诺,路由更改将等到承诺解决后再实例化并激活子组件”听起来很完美,只是路线仍然立即激活......(是不是因为它是子组件将等待 Promise 的 Route2,而不是 Route2 组件本身??)

See https://plnkr.co/edit/ipKrOgfRj0vKk8ZejH5v?p=preview https://plnkr.co/edit/ipKrOgfRj0vKk8ZejH5v?p=preview。 Route2 组件实现了OnActivate界面,但是当您单击 Route2 链接时,Route2组件立即激活。但是,URL 确实更新为/route2只有在承诺解决之后。 (在单独的窗口中启动 Plunker 看看我的意思。)现在我不太关心 URL,Route2 组件根本不应该实例化,直到承诺得到解决。

我的另一个策略是使用@CanActivate装饰师。它更适合我的目的,因为“路由器调用它来确定组件是否可以实例化为导航的一部分”。

这里的问题是如何从 Promise 中传递数据@CanActivate组件的装饰器?

我见过人们将他们的数据写入next装饰器的参数,并在next的参数routerOnActivate method.

例如在next.params (here https://stackoverflow.com/a/34159997/1153681):

@CanActivate((next) => {
  return messageService.getMessage()
      .then((message) => {
         next.params.message = message;
         return true;
      });
})
export class MyComponent implements OnActivate {
  routerOnActivate(next) {
    this.message = next.params.message;
  }
}

Or in next.routeData.data (here https://stackoverflow.com/a/34927099/1153681).

But the 文档 https://angular.io/docs/ts/latest/api/router/ComponentInstruction-interface.html说 ComponentInstruction 对象“应该被视为不可变的”。这很令人困惑。

这是最好的方法吗?

也许当前状态的路由器还没有最终确定,当稳定的 Angular 2 发布时会有更好的方法?


Update

这是在新路由器中实现的>= RC.4

import { Injectable }             from '@angular/core';
import { Router, Resolve,
         ActivatedRouteSnapshot } from '@angular/router';
import { Observable }             from 'rxjs/Observable';
import { Crisis, CrisisService } from './crisis.service';
@Injectable()
export class CrisisDetailResolve implements Resolve<Crisis> {
  constructor(private cs: CrisisService, private router: Router) {}
  resolve(route: ActivatedRouteSnapshot): Observable<any> | Promise<any> | any {
    let id = +route.params['id'];
    return this.cs.getCrisis(id).then(crisis => {
      if (crisis) {
        return crisis;
      } else { // id not found
        this.router.navigate(['/crisis-center']);
        return false;
      }
    });
  }
}
  • https://angular.io/docs/ts/latest/guide/router.html#!#resolve-guard https://angular.io/docs/ts/latest/guide/router.html#!#resolve-guard
  • https://angular.io/docs/ts/latest/api/router/index/Resolve-interface.html https://angular.io/docs/ts/latest/api/router/index/Resolve-interface.html
  • https://angular.io/docs/ts/latest/api/router/index/Routes-type-alias.html https://angular.io/docs/ts/latest/api/router/index/Routes-type-alias.html

Original

也许当前状态的路由器还没有最终确定,当稳定的 Angular 2 发布时会有更好的方法?

事实确实如此。最近有很多关于进一步进展的讨论,并计划进行一些改变。

See also
- Angular 每周会议 https://docs.google.com/document/d/150lerb1LmNLuau_a_EznPV1I1UHMTbEl61t4hZ7ZpS0/edit#(4月4日)
- Router:routerCanActivate 的设计,@CanActivate 的可注入替代品 https://github.com/angular/angular/issues/7784

我见过人们将数据写入装饰器的下一个参数的属性中,并在 routerOnActivate 方法的下一个参数中检索它。

AFAIK 参数应该是不可变的,不应修改。

中的讨论[路由器] CanActivate 和 DI https://github.com/angular/angular/issues/4112展示如何使用 DICanActivate。这就是我将使用的方法。全局共享服务并将其注入CanActivate更新值并将其也注入到您想要访问该值的组件中。

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

在 Angular 2 中激活路由*之前*解析值 的相关文章

  • 跨延迟加载路由创建共享模块

    我正在构建一个 Angular 11 应用程序并尝试创建一个SharedModule 我正在使用延迟加载 并希望避免在延迟加载的路由中多次加载公共模块 我创建了一个共享模块并将其导入到我的AppModule 根据我的理解 这个共享模块应该在
  • 不同事件的角度停止传播

    在我的 Angular 4 应用程序中 我有一个带有 dblclick 处理程序的父组件和一个带有 click 处理程序的子组件 组件 html
  • 如何在 TypeScript 中禁用/抑制库中的错误?

    我打开了一些编译器开关来报告代码中的更多问题 例如严格的空检查 但我在使用的库中遇到了数十个错误 例如 default xxx node modules angular core src util decorators d ts 11 5
  • 避免在 Angular 2+ 中嵌套订阅?

    我有2个端点 1 个端点来获取当前用户的日志 1 个端点来获取该用户的授权 实际上我使用 this user subscribe e gt this grants get e subscribe x gt console log x 但这是
  • 在 Angular 中深度复制对象

    AngularJS 有angular copy 深度复制对象和数组 Angular 也有类似的东西吗 您还可以使用 JSON parse JSON stringify Object 如果它在你的范围内 那么它就存在于每个 Angular 组
  • 修剪日期格式 PrimeNG 日历 - 删除时间戳、角度反应形式

    我将以下内容推入我的反应形式 obj 中2016 01 01T00 00 00 000Z但我想要以下2016 01 01 有谁知道有一个内置函数可以实现上述目的 我已经搜索过文档here https www primefaces org p
  • 为什么 Angular 2 项目如此大 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我们正在用 ng2 重写 ng1 项目 我们的 ng1 项目构建后大约有 8mb 我们对 ng2 的重写已经完成了大约四分之一 并且我
  • 元素不适应 Firefox 上的

    使用 ES6 ish D3js 模块运行 Angular 6 应用程序会导致 Firefox 出现问题 Chromium Chrome Safari 和 IE Edge 工作正常 伪代码看起来类似于 生产代码可以在下面找到
  • Angular - 为每个请求设置标头

    我需要在用户登录后为每个后续请求设置一些授权标头 要为特定请求设置标头 import Headers from angular2 http var headers new Headers headers append headerName
  • 415 不支持的媒体类型; Angular2 到 API

    我是 Angular 2 的新手 我面临着一个无法找到解决方案的问题 当我尝试从 Angular 2 发布到 API 时 我得到 415 不支持的媒体类型 角度2代码 onSubmit value any console log value
  • 没有导出的成员/节点模块

    我刚刚开始使用 5 分钟快速入门找到的 Angular 2 Typescripthere https angular io docs ts latest quickstart html 我遇到了一个看起来很常见的问题 但可能有点不同 我遇到
  • 将 Angular Web 组件 EventEmitter 监听到 javascript

    我在以下工具的帮助下创建了一个小型网络组件本文 https medium com IMM9O web components with angular d0205c9db08f使用角度元素 其中包括 Input and Output 我能够将
  • Angular2 与 ASP.NET 5 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在将 Angular2 与 ASP NET5 gulp 和 typescript 结合使用 当我解决
  • 创建 AoT 兼容的服务工厂

    我正在尝试为缓存服务创建一个服务工厂 主要要求是每次可以使用不同的字符串实例化单个服务 最终的结果会有多个cache每个服务都由唯一定义databaseName 每个缓存可以有一个或多个stores也由唯一定义storeName 其他服务将
  • Angular 6 - 找不到模块“@angular-devkit/build-angular”

    更新到 Angular 6 0 1 后 出现以下错误ng serve Could not find module angular devkit build angular from home Projects myProjectName E
  • 使用 facebook 共享动态更新元标签 - Angular 6

    我需要动态更新元标记 如 og title og description 和 og image 并在 facebook 上共享相同的内容 我已经尝试了所有方法 但没有任何效果 首先 我尝试使用 javascript 设置元标记 如下所示 v
  • Angular2 viewContainerRef.createComponent 工作正常

    我使用 viewContainerRef createComponent 将动态组件加载到根组件 但实际上它附加了错误的位置 my code app compoment ts export class AppComponent privat
  • Angular 5 Http拦截器刷新JWT令牌

    我已经实现了令牌保存 检索的逻辑 并且我也有刷新调用 问题是 当我在 HttpInterceptor 中拦截 403 时 同时进行的其他调用也会刷新令牌 我很乐意保留这些调用 直到我的令牌刷新为止 创建我所说的请求 信号量 Injectab
  • 构建:找不到“节点”的类型定义文件

    VS 2015 社区版 在家 npm 3 10 Angular 2 我试图在 ASP Net MVC 5 应用程序中获取 Angular2 设置 我开始使用的模板使用旧版本的 Angular 因此我更新了包引用 当我构建时 列表中的第一个错
  • 如何在 Angular 项目中使用 Bootstrap?

    我开始我的第一次Angular应用程序和我的基本设置已完成 我怎样才能添加引导程序我的申请 如果您可以提供一个示例 那么这将是一个很大的帮助 如果您使用Angular CLI要生成新项目 还有另一种方法可以使 bootstrap 可访问角度

随机推荐

  • Azure Bot Framework 模拟器错误 - System.ArgumentNullException:值不能为 null

    我需要一些帮助 我是 Azure 机器人框架开发新手 几周前使用 QnA 知识库创建了我的第一个聊天机器人 无论如何 我设法在 Azure 门户中创建了机器人 并且它运行良好 但我需要在 Bot Framework Emulator 使用
  • 从四元数查看矩阵

    我目前正在构建自己的四元数相机 据我所知 您只需要一个四元数即可完全指定相机的方向 如果我错了 请纠正我 那么 我将如何创建视图矩阵 顺便说一下 我使用 C 作为编程语言 任何帮助 将不胜感激 首先是一些注意事项 您会在网络上和有关该主题的
  • 如果一个 ViewController 中有两个 UITableView,一个带有自定义单元格引用,另一个是简单的,会怎么样?

    我正在尝试在一个 ViewController 中使用两个 UITableView 一个 UITableView 带有自定义单元格的引用 另一个很简单 我已经编写了这段代码 但它给了我控制错误可能会到达非 void 函数的末尾 所以给我建议
  • 如何在SQL中实现过滤系统?

    现在我计划在我的网站上添加一个过滤系统 例子 ID apple COLOR red TASTE sweet ORIGIN US ID mango COLOR yellow TASTE sweet ORIGIN MEXICO ID banan
  • 如何更改 powershell 脚本中哈希表列的标题

    我对 Powershell 脚本编写相当陌生 我正在编写一个 power shell 脚本 其中声明了一个哈希表 如下所示 a 1 b 2 my hash my hash Add a b 当我在 Powershell 中打印该表时 哈希表的
  • 在 Task.WhenAll 中执行多个任务时的 C# 线程

    如果在单个线程上执行以下操作 会发生什么 await Task WhenAll items select x gt SomeAsyncMethod x Where SomeAsyncMethod is defined like this w
  • 如果没有 EnableWebMvc,RequestMapping 如何工作?

    I see RequestMapping无需注释即可工作 EnableWebMvc在 Java 配置类级别 这看起来像 EnableWebMvc不再需要 谁能让我理解这里的流程 这是我的工作example显示简单的jsp页面使用弹簧4 1v
  • SLF4J错误:类加载器具有不同类型的类对象

    试图找出为什么我在 tomcat 日志中收到以下错误 Caused by java lang LinkageError loader constraint violation when resolving method org slf4j
  • Java堆中的constantPoolClass?

    我继承了一个 Java 小程序 一个实际的 它在运行大约 4 天后抛出 OutOfMemory 异常 小程序的性质使得人们确实会长时间打开它 运行近两天后 jmap histo 将顶部堆消费者显示为 num instances bytes
  • Numpy 二维移动平均线

    我有一个二维 numpy 数组 我想取每个条目最近的 n 个条目的平均值 就像在一维数组上取滑动平均值一样 最干净的方法是什么 这与应用类似的概念filter to an image 幸运的是 scipy ndimage filters h
  • 奇怪的 HttpClient 结果

    当尝试从 Hitbox API 获取数据时 我得到了一个奇怪的结果 对于一个 API 的命令 这种情况每次都会发生 而对于另一个 API 的命令 这种情况只是有时发生 结果或多或少是这样的 这是我得到的最后结果 u001f b 0 0 0
  • HTML5画布覆盖透明渐变

    我正在 HTML5 中创建一个颜色选择器 如下面的渐变 它由三个要素组成 纯红色背景色 必须可变 从下到上黑 透明渐变 从左到右白色透明渐变 我已经成功创建了单个渐变和单个颜色 但我不知道如何将纯色和两个渐变叠加在一起 我怎样才能做到这一点
  • 如何在两者之间建立一个具有拉取请求的公共/私有 git 存储库 [重复]

    这个问题在这里已经有答案了 我在 github 上有一个公共存储库 我组的每个用户都有一个它的分支 该政策是禁止直接提交到主存储库 所有更改都必须作为来自分叉的拉取请求进来 以便在合并到主存储库之前可以对其进行审查 鉴于有时我们开发的代码必
  • 在实体框架中映射选择存储过程

    我的场景 我将 Visual Studio 2010 与 Entity Framework 4 1 结合使用 我有一个包含许多表和许多存储过程的旧数据库 我正在使用 MVC 3 编写 ASP NET C 程序 我采用了使用 ADO NET
  • Scala - “for-yield”子句在某些条件下可以不产生任何结果吗?

    在 Scala 语言中 我想编写一个函数 在给定范围内生成奇数 该函数在迭代偶数时打印一些日志 该函数的第一个版本是 def getOdds N Int Traversable Int val list new mutable Mutabl
  • python group by 和 count() 多列

    我有一个像这样的数据框 Country A B C UK 1 0 1 US 1 1 1 GB 0 1 1 UK 1 1 1 US 0 1 1 GB 0 1 1 我需要按国家 地区分组并计算值为 1 的所有列 我坚持为所有列设置列 1 的条件
  • Android 按下了数组中的哪个按钮索引

    如何设置 OnClickListener 来简单地告诉我按下了按钮数组中的哪个索引按钮 我可以使用数组更改这些按钮的文本和颜色 我这样设置它们 TButton 1 Button findViewById R id Button01 TBut
  • Xcode——查找项目中的死方法

    我很好奇是否有任何工具可以为此提供部分解决方案 由于performSelector 这是一个棘手的问题 但工具至少应该能够找出候选者 使人类的工作变得更容易 由于 Objective C 的动态特性 使用静态分析不可能检测已定义但未使用的函
  • make 未对 g++ 使用 -std=c++11 选项

    我正在尝试使用 make 编译 C 文件 但是 默认情况下它不使用 std c 11 标志 每当我需要编译使用 c 11 特定功能的程序时 我都必须使用 g 显式编译它 所以 我想问如何让我的系统上的所有 c 文件自动使用选项 std c
  • 在 Angular 2 中激活路由*之前*解析值

    只要承诺尚未解决 我就想阻止访问路线 另外 我想将该承诺的返回值传递给路由组件 Several https stackoverflow com questions 36260780 angular 2 resolve root compon