कैसे कई एएमडी फ़ाइलों में मॉड्यूल प्रसार करने के लिए?

वोट
8

मैं समझ नहीं अगर यह भी संभव एक निर्यात मॉड्यूल है एक से अधिक फ़ाइलों करवाते प्रसार करने के लिए।

अगर मैं फ़ाइल Contact.ts है:

// file Contact.ts
export module Contacts {
   export class Contact {
      ...
   }
}

और एक अन्य ContactView.ts

// file ContactView.ts
export module Contacts {
   export class ContactView {
      model: Contact;  // <---  is not recognized
   }
}

तब टीएससी संपर्क वर्ग पहचान नहीं कर रहा। आप देख सकते हैं संपर्क और ContactView एक ही मॉड्यूल में रहते हैं की घोषणा की और कल्पना यह काम करना चाहिए के अनुसार कर रहे हैं।

मैं require.js और एएमडी पैटर्न का उपयोग करता है तो मैं निर्यात मॉड्यूल घोषणा उपयोग करने के लिए एक समग्र एप्लिकेशन बनाने रहा हूँ।

मैं आगे घोषणा या कुछ मुश्किल आयात किसी प्रकार करना चाहिए?

सलाह के लिए धन्यवाद।

संपादित करें: वर्तमान में मैं प्रत्येक मॉड्यूल अलग से आयात के माध्यम से लोड है, लेकिन, अगर आप ध्यान देंगे, यह आयात निर्भरता के कोड और बहुत कुछ का एक विशाल अपशिष्ट पैदा करता है। अगर वहाँ जाने के लिए टीएस कि मैं आयात करने के लिए मतलब नहीं पता है एक ही नाम स्थान (यानी संपर्क) का उपयोग करने के लिए एक रास्ता है मेरा प्रश्न था। मैं सामान्य // आदेश में देख रहा था, लेकिन यह काम नहीं करता। मैं भी अब तक कोई सफलता के साथ * .d.ts घोषणा फाइलों की कोशिश की।

08/10/2012 को 23:18
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


2 जवाब

वोट
6

कल्पना आप को परिभाषित करने की अनुमति देता है आंतरिक एकाधिक फ़ाइलों को भर में मॉड्यूल (संक्षेप में, आंतरिक मॉड्यूल जावास्क्रिप्ट मॉड्यूल पैटर्न को देखें)। विदेश में इस तरह के एएमडी या CommonJS मॉड्यूल, विचार है कि प्रत्येक फ़ाइल वास्तविक "कोड के मॉड्यूल", और नेमस्पेसिंग है पर काम के रूप में मॉड्यूल, / यह भीतर नामकरण अप्रासंगिक के बाद से मॉड्यूल का अपना नया वस्तु में वैसे भी लोड किया जाएगा है।

आप ContactView.ts मॉड्यूल के अंदर Contact.ts मॉड्यूल लोड करने के लिए निम्न कोड लिख सकते हैं:

// file ContactView.ts    
import mod = module("./Contact");

export module Contacts {
   export class ContactView {
      model: mod.Contacts.Contact;  // <---  will be recognized
   }
}

और वह काफी अच्छी तरह से काम करना चाहिए, लेकिन अगर आप (उदाहरण के लिए एक नया संपर्क मॉडल अपने आप को बनाने के), आप अनिवार्य रूप से उन दोनों को आयात करने के लिए होता है एक अन्य क्षेत्र में दोनों मॉड्यूल की सामग्री के लिए उपयोग किया चाहता था:

import c = module("./Contact");
import cv = module("./ContactView");

जो मुझे लगता है, काफी ठीक है क्योंकि आप स्पष्ट रूप से अपनी निर्भरता बताते हुए कर रहे हैं। नकारात्मक पक्ष नहीं होते कि वे एक आम पैरेंट ऑब्जेक्ट का हिस्सा है, तो होने उन दोनों को एक "संपर्क" मॉड्यूल-पैटर्न में हो शायद बहुत काम की नहीं है।

एक अन्य विकल्प इस प्रकार हैं (दी इस कोड को एक तरह से मूर्ख है, क्योंकि आप पहले से ही ContactView के मॉडल संपत्ति के माध्यम से वास्तव में कर रहे हैं, लेकिन कभी कम ...), "संपर्क" निर्यात करने के लिए "ContactView" के साथ है:

export module Contacts {
   export class ContactView {
       model: mod.Contacts.Contact;
       constructor() {
           this.model = new mod.Contacts.Contact();
       }
    }

    export var Contact = mod.Contacts.Contact;
}

तो तुम लोड ContactView होने के बाद इसे उपयोग करने में सक्षम होगा।

संपादित करें: वैसे, आप के माध्यम से "निर्यात मॉड्यूल नाम {...}" केवल निर्यात मॉड्यूल तक सीमित नहीं हैं, तो आप फ़ाइल ही मॉड्यूल है के रूप में कुछ भी निर्यात कर सकते हैं। तो तुम जो सिर्फ है "निर्यात समारोह foo () {...}" यह लपेटकर किसी भी मॉड्यूल पैटर्न कोड के बिना एक फ़ाइल हो सकता था।

EDIT2: यह एएमडी की तरह दिखता है एक से अधिक निर्भरता लोड हो रहा है और उन लोगों से "मॉड्यूल" के निर्माण के लिए कार्यक्षमता हो सकता है, लेकिन मैं पता नहीं कैसे कि टीएस में काम होता है, यहाँ एक कड़ी है कि उस पर चला जाता है है: http://www.adobe.com /devnet/html5/articles/javascript-architecture-requirejs-dependency-management.html (निर्माता मॉड्यूल)।

09/10/2012 को 02:21
का स्रोत उपयोगकर्ता

वोट
4

मैं थोड़ी देर के लिए एक ही सवाल के साथ संघर्ष किया, और बस साझा करने के लिए मैं क्या कर रहा हूँ मामले में किसी और को इस सवाल के पार भटक चाहता था।

सबसे पहले, मैं अपने आप को एक संदर्भ फ़ाइल है कि मेरे मॉड्यूल में फ़ाइलों के सभी वाणी परिभाषित:

/// <reference path="_contacts.dependencies.ts" />
/// <reference path="../contacts/Contact.ts" />
/// <reference path="../contacts/ContactView.ts" />
/// <reference path="../contacts/ContactModel.ts" />

ध्यान दें कि फाइल के अंदर निर्दिष्ट पथ संदर्भ फ़ाइल ही (के स्थान के सापेक्ष हैं _contacts.ts,) एक विपरीत .jsसंदर्भ फ़ाइल। मेरे निर्देशिका संरचना इस तरह दिखता है:

modules
    references // all of the reference files
        knockout 
        underscore
        // ... a subfolder for every 3rd party library used
    contacts
    commerce 
    // ... other modules at same level as contacts

संदर्भ पर वापस ही फाइल। पहली पंक्ति एक अलग संदर्भ फ़ाइल ऐसे अंडरस्कोर, पल या किसी अन्य मौजूदा पुस्तकालय आप एक है के रूप में मॉड्यूल के द्वारा प्रयोग किया बाहरी पुस्तकालयों, के सभी लिस्टिंग शामिल .d.tsके लिए परिभाषा फ़ाइल। शेष लाइनों कि मॉड्यूल बनाने फ़ाइलें हैं।

हर फ़ाइल कि मॉड्यूल का हिस्सा है अंदर, मैं संदर्भ ऊपर फ़ाइल:

/// <reference path="../references/_contacts.ts" />
module Contacts {
    export class Contact { 
        public model: ContactModel;
        // ...
    }
} 

इसी तरह, आप अपने सभी मॉड्यूल सूची एक भी संदर्भ फ़ाइल बना सकते हैं:

/// <reference path="_address.ts" />
/// <reference path="_contacts.ts" />
/// <reference path="_commerce.ts" />

और बस अपने स्रोत फ़ाइलों से उल्लेख किया है।

यह उत्सर्जित कोड अलग फ़ाइलों में किया जा रहा है की समस्या है, हालांकि समाधान नहीं करता है। कि इस समस्या के लिए मैं एक जावास्क्रिप्ट minification उपकरण है, जो एक ही स्रोत फ़ाइल में एक से अधिक फ़ाइलों अप bundling करने में सक्षम है का उपयोग कर रहा हूँ। अपने संकलन सेटिंग्स और उपयोग के मामले आवश्यकताओं के आधार पर, आप उत्पन्न कोड के आसपास कुछ आवरण लागू करने के लिए यह एक एएमडी मॉड्यूल के रूप में (भी उस भाग से परिचित नहीं अभी तक) काम करने के लिए आवश्यकता हो सकती है।

13/12/2012 को 00:12
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more