Wie Modul über mehrere AMD-Dateien zu verbreiten?

stimmen
8

Ich kann nicht herausfinden, ob es überhaupt möglich, ein „Exportmodul“ hat mehrere Dateien verteilt accross.

Wenn ich Datei Contact.ts:

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

und ein anderer ContactView.ts

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

Dann wird TSC nicht die Kontaktklasse zu erkennen. Wie Sie der Kontakt und die Contact sehen deklarieren im gleichen Modul residieren und gemäß der Spezifikation sollte es funktionieren.

Ich baue eine zusammengesetzte Anwendung, die die require.js und AMD-Muster verwendet, damit ich die „Exportmodul“ Deklaration verwenden müssen.

Soll ich irgendeine Art von „vorauser Erklärung“ oder einem tricky „Import“?

Vielen Dank für die Beratung.

EDIT: Zur Zeit lade ich jedes Modul separat über Import, aber, wenn Sie bemerken, es schafft eine enorme Verschwendung von Code und vielen „Import“ Abhängigkeiten. Meine Frage war, ob es einen Weg gibt, den gleichen Namensraum zu verwenden (dh Kontakte), um die TS wissen zu lassen, dass ich meine nicht zu importieren. Ich war auf der Suche in den normalen // Befehl, aber es funktioniert nicht. Ich habe sogar versucht, die Erklärung Dateien .d.ts * ohne Erfolg bisher.

Veröffentlicht am 08/10/2012 um 23:18
quelle vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
6

Die Spezifikation kann Sie festlegen , interne Module in mehreren Dateien (im Wesentlichen interne Module mit den Javascript - Modul Mustern beziehen). Externe Module, wie AMD oder Commonjs Module, die Arbeit an der Idee , dass jede Datei die eigentliche „Modul - Code“ ist, und die Namespacing / in ihm zu benennen , ist irrelevant , da das Modul ohnehin in sein eigenes neues Objekt geladen werden.

Sie könnten den folgenden Code schreiben die Contact.ts Modul innerhalb des ContactView.ts Modul zu laden:

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

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

Und das sollte gut genug funktionieren, aber wenn man wollte Zugriff auf den Inhalt der beiden Module in einem anderen Bereich haben (um zum Beispiel ein neues Kontakt-Modell selbst machen), würden Sie im Wesentlichen müssen beide importieren:

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

Was ich denke, ist fein genug, da Sie klar sind Ihre Abhängigkeiten besagt. Der Nachteil ist, dass sie ein gemeinsames übergeordnetes Objekt teilen würden nicht, so haben beide sie wahrscheinlich in einem „Kontakt“ Modul-Muster sein ist nicht von großem Nutzen.

Eine weitere Option ist „Kontakt“ zusammen mit „Contact“ wie folgt (gewährt dieser Code ist irgendwie albern, weil Sie schon genau, dass über das Modell Eigentum von Contact tun, aber nie weniger ...) zu exportieren:

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

    export var Contact = mod.Contacts.Contact;
}

So würden Sie in der Lage, darauf zuzugreifen, nachdem Contact geladen zu haben.

EDIT: Übrigens, Sie sind nicht nur auf den Export-Module über „Export-Modul-Name {...}“ begrenzt ist, kann man alles als Datei exportieren selbst das Modul. So könnten Sie eine Datei, die nur „Export-Funktion foo () {...}“ hat ohne Modul-Modellcode Einwickeln es.

EDIT2: Es ist wie AMD sieht mehrere Abhängigkeiten haben könnte Funktionalität zum Laden und „Module“ von denen , die Konstruktion, aber ich habe keine Ahnung , wie das in TS funktionieren würde, hier ist ein Link, der über das geht: http://www.adobe.com /devnet/html5/articles/javascript-architecture-requirejs-dependency-management.html (Constructor Module).

Beantwortet am 09/10/2012 um 02:21
quelle vom benutzer

stimmen
4

Ich kämpfte mit der gleichen Frage für eine Weile, und wollte nur teilen, was ich im Fall tue sonst jemand über diese Frage wandert.

Zuerst habe ich mich definiert eine Referenzdatei, die alle Dateien in meinem Modul erklärt:

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

Beachten Sie, dass Pfade in der Datei angegebene bezüglich zu der Stelle der Referenzdatei selbst ( _contacts.ts), im Gegensatz zu einer .jsReferenzdatei. Meine Verzeichnisstruktur sieht wie folgt aus :

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

Zurück zum Referenz - Datei selbst. Die erste Zeile enthält eine separate Referenzdatei alle externen Bibliotheken , die von dem Modul verwendet die Auflistung, wie Strich, Moment oder jede andere vorhandene Bibliothek Sie haben .d.tsfür Definitionsdatei. Die übrigen Linien sind die Dateien , die das Modul bilden.

Innerhalb jeder Datei, die Teil des Moduls, das Bezugs ich die obige Datei:

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

In ähnlicher Weise können Sie eine einzelne Referenzdatei erstellen, die alle Ihre Module zur Liste:

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

Und zeigen Sie einfach auf diese von Quelldateien.

Dies löst nicht das Problem des emittierten Code in separaten Dateien zu sein, aber. Für dieses Problem habe ich mit einem Verkleinerungswerkzeug JavaScript, die aus Bündeln mehrerer Dateien in einer einzigen Quelldatei kann. Je nach Ihren Kompilierungseinstellungen und Use-Case-Bedürfnissen, müssen Sie möglicherweise einige Wrapper um den generierten Code gelten für sie als AMD-Modul arbeiten (nicht allzu vertraut mit diesem Teil noch) nicht.

Beantwortet am 13/12/2012 um 00:12
quelle vom benutzer

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