2016-02-12 2 views
3

Я хочу создать боковое меню в приложении ionic 2, где компонент навигации страницы размещен во внешнем json-файле, полученном с помощью функции menuService.getMenu ,Как преобразовать значение «String» в «Type» в Angular 2

МОЯ структура 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. Я попытался преобразовать, используя Type as Type (menu.component). Но мой результат в консоли - это функция с анонимным именем. Кто-то, пожалуйста, помогите мне в том, чтобы строка json была преобразована в компонент «Тип» для навигации.

+0

Похоже DUP из http://stackoverflow.com/questions/15338610/dynamically-loading-a-typescript-class-reflection-for-typescript –

+0

Нет, я хочу 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.

... то вам необходимо будет ввести отбрасывать предшествующую NAM espace (объект). Я предпочитаю утверждать, чтобы any в этом случае, как это короче, чем определение строчный интерфейс для строки на основе индекса подписи, и вы фактически не теряете безопасность типов:

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

Кроме того, это подход также отлично работает с модулями:

import * as Components from "./components"; 

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

Hi @John White. я получаю «не могу прочитать свойство« GridPage »неопределенной ошибки» при использовании var check = ( this.app.Components) [typevar]; Просьба помочь – AishApp

+0

@ Aish123 Это означает, что 'this.app.Components' не определен. Обычно это вызвано проблемами с упорядочением файлов, если вы компилируете в один выходной файл. Если вы компилируете в один выходной файл, попробуйте указать ссылочные пути для компилятора, чтобы узнать правильный порядок файлов. Ошибка, которую вы получаете, не является специфической для получения типов из строк. –

+0

Я не уверен, поддерживается ли команда в угловом тексте. Я получаю синтаксическую ошибку в ts. Заказ файла не имеет значения в моем случае, поскольку я импортирую все свои файлы при инициализации моего приложения. – AishApp