2016-07-01 5 views
5

इससे पहले कि किसी को भी निशान इस डुप्लीकेट के रूप में कृपया निम्न पढ़ें,className पर आधारित कक्षा का बनाया जा रहा है उदाहरण: स्ट्रिंग

मेरे परिदृश्य सिर्फ टाइपप्रति शामिल नहीं करता है, लेकिन यह भी Angular2।

उद्देश्य

मैं app.component.ts में एक तरीका है जिसके एक स्ट्रिंग (कक्षा नाम) लेता है और इस बात का एक उदाहरण बनाता है की जरूरत है। कक्षाएं अन्य टीएस फाइलों में मौजूद हैं।

उपयोग के मामले के लिए अब: मैं एक विधि getWidgetObjectFromClassName(className : string) : Object{} जो वर्ग के नाम जो स्ट्रिंग स्वरूप में है के उदाहरण वापस जाने के लिए की आवश्यकता है। अब समस्या,

मैंने नेमस्पेस का उपयोग करने की कोशिश की और let instance = new SampleNS['OtherName'](); (नमूना नाम एक नामस्थान) कर रहा है, एकल फ़ाइल के मामले में पूरी तरह से ठीक काम करता है।

लेकिन अब मेरे पास एकाधिक ts फ़ाइलें हैं interfaces.ts, classes.ts, otherclasses.ts कहें। मैं इंटरफेस में export namespace SampleNS{} का उपयोग कर रहा हूं। सभी काम करता है, /// <reference path="interfaces.ts" /> और उसी नामस्थान SampleNS का उपयोग कर कक्षाओं में अगला।

अब मेरी विधि getWidgetObjectFromClassName(className : string) : Object{} xyz.ts में है, और अब मुझे कौन सा आयात देना चाहिए ?, मेरा मुद्दा यह है कि मैं './interfaces' से 'आयात {नमूना} कहता हूं। यहां समस्या यह है कि मैं केवल एक फ़ाइल का नामस्थान आयात कर सकता हूं (भले ही यह वही हो) इसलिए आईएम बनाने का उदाहरण उस विशिष्ट फ़ाइल नामस्थान के आयात तक ही सीमित है।

Plunker लिंकhttps://plnkr.co/edit/pt90F34KPsGoHDpSUQFD?p=preview

+0

क्या एक फ़ाइल है कि अपने सभी घटक निर्यात करता है बनाने के बारे में है, तो आप सिर्फ यह फ़ाइल आयात करने की आवश्यकता एक नामस्थान और फिर आप सभी घटकों को उसी तरह संदर्भित करने में सक्षम होना चाहिए? –

+1

* "इससे पहले कि कोई इसे डुप्लिकेट के रूप में चिह्नित करता है, कृपया नीचे पढ़ें," * - नहीं, मैं यह तय करना पसंद करता हूं कि सिक्का फ़्लिप करके चीजें डुप्लीकेट हैं या नहीं। – nnnnnn

+0

ठीक गनटर ... आपके समाधान का प्रयास करने से वापस आ जाएगा ... –

उत्तर

6

import * as widgets from './lib'; 
... 
this.widgetInstance = new widgets[className](); 
की तरह आयात के साथ उपयोग

Plunker example

मैं एक जवाब से यह याद रखना लेकिन मैं इसे कुछ श्रेय देना नहीं पा सके: -/

+0

हमेशा के रूप में आप कमाल हो गए हैं! –

1

आप वर्ग के नाम से एक वस्तु बनाने के लिए eval उपयोग कर सकते हैं:

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")); 

खेल का मैदान here

+0

यह पूरी तरह से ठीक काम करता है, लेकिन अब मेरे परिदृश्य के लिए, जब मेरे पास अन्य एसएस फाइलों पर मेरा कुछ क्लास है और यहां तक ​​कि अगर मैं इसे आयात करता हूं तो इसे नहीं मिल सकता है। कृपया –

+2

जांचें शायद आपको मॉड्यूल या नेमस्पेस को शामिल करने की आवश्यकता होगी: getWidgetObjectFromClassName ("मॉड्यूलऑरनामस्पेस।SomeClass ") –

+0

यह एक साफ समाधान नहीं है, लेकिन निश्चित रूप से काम करता है, क्यों डाउनवोट? – titusfx

संबंधित मुद्दे