2016-12-05 34 views
5

official docs से हम जानते हैं कि@ कॉम्पोनेंट सजावट वास्तव में क्या करता है?

घटक डेकोरेटर आप एक कोणीय घटक के रूप में एक वर्ग के निशान और अतिरिक्त मेटाडेटा तय करता है कि घटक, संसाधित किया जाना चाहिए instantiated और रनटाइम पर इस्तेमाल किया प्रदान करने के लिए अनुमति देता है।

लेकिन मैं गहराई में जाने और समझने की क्या घटक डेकोरेटर वास्तव में अतिरिक्त मेटाडेटा प्रदान को छोड़कर करता है करना चाहते हैं।

मैंने स्रोत कोड में डाला और पाया कि सभी सजावटी makeDecorator फ़ंक्शन की सहायता से बनाए गए हैं। और यहाँ मैं खो गया। घटक और ngModule सजावट के लिए उदाहरण के लिए अंतर कहां है? क्या वे वही काम कर रहे हैं? ऐसा मत सोचो।

एक उत्तर की तरह यह कदम उठाने के लिए बहुत अच्छा होगा कि मुझे घटक सजावट के बिना घटक सजावट को फिर से बनाने के लिए क्या करना चाहिए।

यूपीडी: और, हां, ज़ाहिर है, मुझे पता है कि टाइपस्क्रिप्ट सजावट कैसे काम करते हैं।

उत्तर

8

लेकिन मैं गहराई से जाना चाहता हूं और समझ सकता हूं कि अतिरिक्त मेटाडेटा को छोड़कर घटक सजावट वास्तव में क्या करता है।

इसे और कुछ और करने की आवश्यकता क्यों है? ऐसा कहा जाता है कि @Component सजावटी समारोह में पारित तर्क घटक मेटाडेटा है। मेटाडेटा प्रदान करने के लिए यह मुख्य जिम्मेदारी है।

सबसे आसान तरीका है, अगर आप कुछ इसी तरह पुन: पेश करना चाहते हैं

  1. reflect-metadata स्थापित है।

    npm install --save reflect-metadata 
    
  2. डेकोरेटर समारोह बनाएं

    import 'reflect-metadata'; 
    
    interface MyComponentMetadata { 
        template?: string; 
        selector?: string; 
    } 
    
    function MyComponent(metadata: MyComponentMetadata) { 
        return function(ctor: Function) { 
        // add metadata to constructor 
        Reflect.defineMetadata('annotations', metadata, ctor); 
        } 
    } 
    
  3. यह

    @MyComponent({ 
        selector: 'component', 
        template: '<hello></hello>' 
    }) 
    class HelloComponent { 
    } 
    
  4. का प्रयोग अब जब आप मेटाडाटा प्राप्त करने की आवश्यकता है, बस कर

    let metadata = Reflect.getMetadata('annotations', HelloComponent); 
    

मेटाडेटा का उद्देश्य कक्षा के साथ क्या करना है यह जानने के लिए अंगुलर के लिए जानकारी प्रदान करना है। तो सजावटी को वास्तव में केवल मेटाडेटा प्रदाता से कुछ भी नहीं होना चाहिए। कोणीय निर्णय लेता है कि मेटाडेटा के साथ क्या करना है, न कि सजावटी समारोह।


- TypeScript documentation on decorators

+0

FYI देखें: मेरी '@ कोणीय/cli' @ 1.2 में।1 प्रोजेक्ट को 'definineMetadata' और' getMetadata' फ़ंक्शंस 'के बारे में जागरूक बनाने के लिए' main.ts' फ़ाइल के शीर्ष पर 'प्रतिबिंबित-मेटाडेटा' आयात करना था। मेरे सजावटी स्रोत फ़ाइल में आयात करने से कंपाइलर को '@ NgModule' सजावट' के बारे में शिकायत करने का कारण बन गया। – TekTimmy

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