2016-07-01 20 views
5

Zanim ktokolwiek oznacza to jako duplikat proszę przeczytać poniżej,Tworzenie instancji klasy na podstawie className: string

Mój scenariusz nie tylko maszynopis, ale również obejmować Angular2.

Cel

muszę metodę w app.component.ts który pobiera ciąg (nazwa klasy) i tworzy instancję tego. Klasy istnieją w innych plikach ts.

teraz do przypadku użycia: Mam metodę getWidgetObjectFromClassName(className : string) : Object{} który musi powrócić wystąpień nazwy klasy, który jest w formacie strun. Teraz problem,

Próbowałem używać NameSpace i robi let instance = new SampleNS['OtherName'](); (SampleNS to przestrzeń nazw), działa idealnie dobrze w przypadku pojedynczego pliku.

Ale teraz Mam wiele plików ts, powiedzmy, interfejsy.ts, classes.ts, otherclasses.ts. Im przy użyciu export namespace SampleNS{} w interfejsie.ts wszystkie prace, następnie w classes.ts przy użyciu /// <reference path="interfaces.ts" /> i tej samej przestrzeni nazw SampleNS.

Teraz moja metoda getWidgetObjectFromClassName(className : string) : Object{} jest w xyz.ts, a teraz, który import powinienem dać?, Mój punkt jest, gdy mówię `import {SampleNS} z" ./interfaces ". Problem polega na tym, że mogę zaimportować tylko przestrzeń nazw jednego pliku (nawet jeśli jest taka sama), dlatego tworzenie instancji jest ograniczone do importu tej konkretnej przestrzeni nazw plików.

Plunker linkhttps://plnkr.co/edit/pt90F34KPsGoHDpSUQFD?p=preview

+0

Co o stworzenie pliku, który eksportuje swoje składnik, to trzeba po prostu importować ten plik przestrzeń nazw, a następnie powinieneś móc odnosić się do wszystkich składników w ten sam sposób? –

+1

* "Zanim ktokolwiek zaznaczy to jako duplikat, przeczytaj poniżej," * - Nie, wolę ocenić, czy rzeczy są duplikowane przez rzut monetą. – nnnnnn

+0

ok gunter ... wypróbowanie rozwiązania ur będzie odzyskiwać ... –

Odpowiedz

6

Korzystanie as z importu jak

import * as widgets from './lib'; 
... 
this.widgetInstance = new widgets[className](); 

Plunker example

Pamiętam to z innej odpowiedzi, ale nie mogłem znaleźć to, aby dać pewną kredyt: -/

+0

Jak zawsze byłeś wspaniały! –

1

Można użyć eval utworzyć obiekt z nazwą klasy:

class SomeClass 
{ 
    x: number; 
    y: number; 
    constructor() { 
     this.x = this.y = 1; 
    } 

} 



function getWidgetObjectFromClassName(className : string) : {} 
{ 
    return eval("new " + className + "();"); 
} 

console.log("%o", getWidgetObjectFromClassName("SomeClass")); 

Playground here

+0

Działa to doskonale, ale teraz dla mojego scenariusza, gdy mam SomeClass na inne pliki ts, a nawet jeśli go zaimportować, to nie może go znaleźć. Proszę sprawdzić –

+2

Prawdopodobnie będziesz musiał dołączyć moduł lub przestrzeń nazw: getWidgetObjectFromClassName ("ModuleOrNamespace.SomeClass ") –

+0

To nie jest czyste rozwiązanie, ale na pewno działa, dlaczego w dół? – titusfx

Powiązane problemy