2016-04-23 78 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

謝謝你的回答。 我試着用服務分享數據的解決方案。我希望很快會有另一種解決方案。 –