2016-04-23 79 views
0

在Angular 2中,我有一个MyObjectComponent,它显示了一个myObjects的数组。我从MyObjectService得到这个myObjects,被调用。Angular2:将对象从@CanActivate()传递到组件 - > Typescript错误

@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 error: TS2322: Type 'any[]' is not assignable to type 'string'.

然而,由此产生的JavaScript按预期工作。但我想摆脱Typescript错误消息。

错误的结果,因为在ComponentInstruction的params对象的定义:

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

当然我可以改变类ComponentInstruction但是这将是一个有点难看。

有没有人有一个想法如何摆脱这个错误信息?

回答

1

params应该被视为不可变的。

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

的另一种方法是使用

_router.navigate(...)并通过自定义路由参数那里。

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

+0

我的目标是在路由之前解析数据。这在Angular1中可以在路由定义中使用'resolve'。 所以我必须创建一个新的服务。这个新服务接收来自'@CanActivate()'和'@CanActivate()的数据'解决了存储过程完成时的承诺。然后,我可以在MyComponent中使用新服务而无需等待数据。 这不是有点矫枉过正?如果我的应用程序中有不同类型的'MyObjects',我将不得不为每种类型编写一个特殊的服务来共享数据。或者没有类型安全的所有'MyObjects'的一般服务。 –

+0

Angular团队知道路由器有严重的局限性。路由器正在进行中。预计会有很多变化。 –

+1

谢谢你的回答。 我试着用服务分享数据的解决方案。我希望很快会有另一种解决方案。 –

相关问题