2016-02-12 67 views
3

我想在離子2應用程序中創建一個側邊菜單,其中頁面導航組件位於使用menuService.getMenu函數獲取的外部json文件中。如何在Angular 2中將「字符串」值轉換爲「類型」

MY JSON結構:

"menu":[ 
     { 
      "title":"Grid", 
      "component":"GridPage" 
     } 
     ] 

我的TS:

this.menuService.getMenu().then((menu) => { 
    this.menu = menu; 
    }); 

    openPage(menu) { 
     console.log("menu", menu.component); 
     nav.setRoot(menu.component); 
    } 

控制檯日誌輸出字符串GridPage。我嘗試使用類型作爲類型(menu.component)轉換。但我在控制檯中的結果是一個匿名的函數。有人請幫助我將json字符串轉換爲組件「Type」以便導航工作。

+0

貌似http://stackoverflow.com/questions/15338610/dynamically-loading-a-typescript-class-reflection-for-typescript –

+0

的DUP號我要GridPage(menu.component)在調用nav.setRoot時加載。由於它是字符串的類型,我得到錯誤。 – AishApp

+0

我明白了,你需要的是類型,而不是實例。 –

回答

6

我想有一種方法可以通過字符串獲得類的類型,但我不知道(我不使用TS)。一個簡單的解決方法是

創建串地圖鍵入

classes = { 
    'MyClass1': MyClass1, 
    'MyClass2': MyClass2, 
    'Grid': Grid 
} 

,然後就看種類多達

class['Grid'] 

的缺點是,你需要知道的所有受支持的類中提前。

+0

謝謝!讓我擺脫束縛。這應該可以被接受的答案。 – esqew

3

不知角2的深度,但在一個結構良好的應用程序也很簡單,可行的使用字符串,如果知道給定類型的完全合格的名稱得到一個類型:

let typeName = "GridPage"; 
let ComponentType = MyApp.Components[typeName]; 

如果您收到以下錯誤類型:

Index signature of object type implicitly has an 'any' type.

...那麼你就需要類型轉換前南空間(對象)。我寧願主張以any在這種情況下,它比定義爲基於字符串的指數簽名的在線界面更短,並且您有效地不輸任何類型的安全:

let ComponentType = (MyApp.Components as any)[typeName]; 

此外,該辦法還與模塊完美的作品:

import * as Components from "./components"; 

let ComponentType = (Components as any)[typeName]; 
+0

嗨@John White。我使用var check =( this.app.Components)[typevar];獲取「無法讀取屬性'GridPage'的未定義錯誤」。請幫助 – AishApp

+0

@ Aish123這意味着'this.app.Components'是未定義的。如果您編譯爲單個輸出文件,這通常是由文件排序問題引起的。如果您正在編譯爲單個輸出文件,請嘗試指定編譯器的參考路徑以瞭解正確的文件順序。您收到的錯誤不是特定於從字符串獲取類型。 –

+0

我不確定在angular2 typescript中是否支持該命令。我在ts中出現語法錯誤。在我的情況下,文件順序並不重要,因爲我正在初始化我的應用程序時導入所有文件。 – AishApp

相關問題