【问题标题】:Angular2: Passing object from @CanActivate() into component -> Typescript ErrorAngular2:将对象从@CanActivate() 传递到组件中-> Typescript 错误
【发布时间】:2016-08-17 01:23:24
【问题描述】:

在 Angular 2 中,我有一个 MyObjectComponent,它显示了一个 myObjects 数组。我从由@CanActivate 调用的MyObjectService 得到这个myObjects

@CanActivate((next: ComponentInstruction, previous: ComponentInstruction) => {

    let myObjectService: MyObjectService = //get my ObjectService here....

    return new Promise((resolve) => {
        myObjectService.getMyObjects()
            .subscribe((myObjects) => {
               next.params['myObjects'] = myObjects;
               resolve(true);
             });
    })

在我的组件中,我通过

获取数据
routerOnActivate(next) {
    this.myComponentObjectVariable = next.params.myObjects;
}

这有效,但前提是我添加到 next.params['myObjects']myObjects 是一个字符串。

如果我添加一个对象,我会得到一个

Typescript 错误:TS2322:类型“any[]”不可分配给类型“string”。

但是,生成的 JavaScript 按预期工作。但我想摆脱 Typescript 错误消息。

错误是因为ComponentInstruction中定义了params对象:

declare class ComponentInstruction {
    ... some other data ...
    params: {
        [key: string]: string;
    }; 
}

当然,我可以更改课程ComponentInstruction,但这有点难看。

有没有人知道如何摆脱这个错误信息?

【问题讨论】:

    标签: typescript angular


    【解决方案1】:

    params 应该被视为不可变的。

    我建议您使用链接到此评论 https://github.com/angular/angular/issues/4112#issuecomment-153811572 的 Plunker 中演示的方法,并使用共享服务而不是路由参数传递值。

    另一种方法是使用

    _router.navigate(...) 并在那里传递自定义路由参数。

    对于这种情况,您还需要 Plunker 中演示的方法来获取应用程序 Router 实例。

    【讨论】:

    • 我的目标是在路由之前解析数据。这在 Angular1 中使用 resolve 在路由定义中是可能的。所以我必须创建一个新服务。这个新服务接收来自@CanActivate() 的数据,并且@CanActivate() 在存储过程完成时解析承诺。然后我可以在MyComponent 中使用新服务而无需等待数据。这是不是有点矫枉过正了?如果我的应用程序中有不同类型的MyObjects,我将不得不为每种类型编写一个特殊的服务来共享数据。或者为所有 MyObjects 提供一般服务,但没有类型安全。
    • Angular 团队意识到路由器有严重的限制。路由器正在进行中。预计会有很多变化。
    • 感谢您的回答。我尝试了通过服务共享数据的解决方案。我希望很快就会有另一种解决方案。
    猜你喜欢
    • 2016-12-16
    • 2018-07-15
    • 1970-01-01
    • 2016-05-10
    • 2017-04-30
    • 1970-01-01
    • 2018-07-11
    • 2018-03-25
    • 1970-01-01
    相关资源
    最近更新 更多