2016-02-12 107 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

相关问题