Πώς να εξαπλωθεί μονάδα σε πολλαπλά αρχεία AMD;

ψήφοι
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
   }
}

Στη συνέχεια TSC δεν αναγνωρίζει την κλάση Επικοινωνία. Όπως μπορείτε να δείτε η Επικοινωνία και η ContactView δηλώνονται να διαμένει στην ίδια μονάδα και σύμφωνα με το spec θα πρέπει να λειτουργεί.

Χτίζω ένα σύνθετο εφαρμογή που χρησιμοποιεί τις require.js και τα σχέδια της AMD έτσι θα πρέπει να χρησιμοποιήσετε τη δήλωση «μονάδα εξαγωγής».

Πρέπει να κάνω κάποιο είδος της «δήλωσης μπροστά» ή κάποιο δυσνόητο «εισαγωγή»;

Ευχαριστώ για τη συμβουλή.

EDIT: Αυτή τη στιγμή έχω φορτώσει κάθε μονάδα ξεχωριστά μέσω των εισαγωγών, αλλά, αν θα παρατηρήσετε, δημιουργεί μια τεράστια σπατάλη του κώδικα και πολλά εξαρτήσεις «εισαγωγής». Η ερώτησή μου ήταν αν υπάρχει ένας τρόπος για να χρησιμοποιήσει το ίδιο πεδίο ονομάτων (δηλαδή Επαφές) για να γνωρίζουν το TS που δεν εννοώ να εισαγάγετε. Έψαχνα στην κανονική εντολή //, αλλά δεν λειτουργεί. Προσπάθησα ακόμη και τα αρχεία δήλωση του * .d.ts χωρίς επιτυχία μέχρι στιγμής.

Δημοσιεύθηκε 08/10/2012 στις 23:18
πηγή χρήστη
Σε άλλες γλώσσες...                            


2 απαντήσεις

ψήφοι
6

Το spec σας επιτρέπει να ορίσετε εσωτερικές μονάδες σε πολλαπλά αρχεία (στην ουσία, εσωτερικές μονάδες αναφέρονται στην javascript μοτίβο ενότητα). Εξωτερικές μονάδες, όπως η AMD ή CommonJS ενότητες, οι εργασίες για την ιδέα ότι κάθε αρχείο είναι η πραγματική «ενότητα του κώδικα», και το χώρο ονομάτων / ονοματοδοσία μέσα σε αυτό είναι άνευ σημασίας, δεδομένου ότι η μονάδα θα φορτωθεί στο δικό νέο αντικείμενο της ούτως ή άλλως.

Θα μπορούσατε να γράψετε τον παρακάτω κώδικα για να τοποθετήσετε τη μονάδα Contact.ts στο εσωτερικό της μονάδας ContactView.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.

EDIT: Με την ευκαιρία, δεν είστε περιορίζεται σε μονάδες μόνο για εξαγωγή μέσω του «Όνομα μονάδα εξαγωγής {...}», μπορείτε να εξάγετε τα πάντα με το αρχείο από μόνο του είναι η ενότητα. Έτσι, θα μπορούσατε να έχετε ένα αρχείο που μόλις έχει «foo λειτουργία εξαγωγής () {...}» χωρίς κωδικό μονάδα-πρότυπο περιτύλιγμα αυτό.

EDIT2: Μοιάζει AMD μπορεί να έχει λειτουργικότητα για τη φόρτωση πολλαπλές εξαρτήσεις και την κατασκευή «ενότητες» από αυτά, αλλά δεν έχω ιδέα πώς αυτό θα μπορούσε να λειτουργήσει σε TS, εδώ είναι μια σύνδεση που πηγαίνει πέρα από αυτό: http://www.adobe.com /devnet/html5/articles/javascript-architecture-requirejs-dependency-management.html (modules Κατασκευαστής).

Απαντήθηκε 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" />

Και απλά να επισημάνω σε αυτό από τα αρχεία προέλευσης.

Αυτό δεν λύνει το πρόβλημα της εκπεμπόμενης κώδικας είναι σε ξεχωριστά αρχεία, όμως. Για το πρόβλημα είμαι χρησιμοποιώντας ένα εργαλείο σμίκρυνσης JavaScript, το οποίο είναι ικανό δέσμες πολλαπλών αρχείων σε ένα ενιαίο αρχείο προέλευσης. Ανάλογα με τις ρυθμίσεις συλλογή σας και τις ανάγκες περίπτωση χρήσης, μπορεί να χρειαστεί να εφαρμόσετε κάποιο περιτύλιγμα γύρω από το παραγόμενο κώδικα για να λειτουργήσει ως μονάδα AMD (δεν είναι πολύ εξοικειωμένοι με αυτό το μέρος ακόμα).

Απαντήθηκε 13/12/2012 στις 00:12
πηγή χρήστη

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