Nasıl birden AMD dosyalar arasında modülü yaymak için?

oy
8

hatta mümkünse bir ihracat modülü sahip birden fazla dosya genelinde yaymak için eğer çözemiyorum.

Eğer ben dosya Contact.ts var:

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

ve başka ContactView.ts

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

Sonra TSC İletişim sınıfını tanımıyor. Eğer İletişim ve ContactView aynı modülünde yer alan ilan ve çalışması gerekir spec göre olan görebileceğiniz gibi.

Ben ihracat modülü beyanı kullanmak VAR böylece require.js ve AMD desenleri kullanan bir kompozit app inşa ediyorum.

Ben ileride beyanı veya bazı zor ithal bir tür yapalım mı?

tavsiye için teşekkürler.

DÜZENLEME: Fark edeceğiniz eğer anda ben ithal bağımlılıkları kodu ve çok muazzam bir atık oluşturur, ithalat yoluyla ayrı ayrı modülü yüklemeye ama. Ben ithal etmek istemem TS bildirmek için aynı ad (yani Rehber) kullanmak için bir yol olup olmadığını Sorum oldu. Normal // komutu içine bakıyordu, ama çalışmıyor. Hatta bugüne kadar hiçbir başarı ile * .d.ts beyan dosyaları çalıştı.

Oluştur 08/10/2012 saat 23:18
kaynak kullanıcı
Diğer dillerde...                            


2 cevaplar

oy
6

Spec tanımlamanızı sağlar (özünde, iç modüller javascript modül desen bakın) birden fazla dosya üzerinde modülleri. Dış modül zaten kendi yeni nesneye yüklenecek beri böyle AMD veya CommonJS modüllerin her dosya asıl "kod modülü" ve ad alanlarının olduğu fikri üzerine çalışma gibi modüller, / onun içinde adlandırma alakasız.

Sen ContactView.ts modülün içine Contact.ts modülü yüklemek için aşağıdaki kodu yazabilirsiniz:

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

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

Ve bu yeterince iyi çalışması gerekir, ancak (örneğin yeni bir irtibat modeli kendiniz yapmak) esasen her ikisi ithal etmek, sen olurdu başka bir alanda hem modüllerin içeriğine ulaşılabilir istiyorsa:

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

açık bir şekilde bağımlılıkları belirten çünkü hangi Bence yeterince iyi. Olumsuz muhtemelen çok kullanışlı değil yani ikisini bir "İletişim" modül-desende olması ihtiva eden ortak bir ebeveyn nesnesi paylaşan olmaz olmasıdır.

Başka bir seçenek aşağıdaki gibi (zaten ContactView model özelliği aracılığıyla tam olarak yapıyoruz çünkü bu kod biraz saçma olduğunu verilmiş, ama asla daha az ...), "ContactView" ile birlikte "İletişim" ihraç etmektir:

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

    export var Contact = mod.Contacts.Contact;
}

Yani ContactView yüklenen sonra erişmek mümkün olurdu.

DÜZENLEME: Bu arada, "ihracat modülü Adı {...}" üzerinden sadece ihraç modüllerin sınırlı değildir, sen kendini modülüdür dosyası olarak her şeyi aktarabilirsiniz. Yani sadece sarmalanmış herhangi modül desenli kodu olmadan "ihracat fonksiyonu foo () {...}" olan bir dosya var olabilir.

EDIT2: Birden fazla bağımlılıkları yükleme ve olanlardan "modüllerini" oluşturma özelliğe sahip olabilir AMD gibi görünüyor, ama bunun TS çalışacağını nasıl hiçbir fikrim yok, burada o gider bir bağlantı: http://www.adobe.com /devnet/html5/articles/javascript-architecture-requirejs-dependency-management.html (Oluşturucu modüller).

Cevap 09/10/2012 saat 02:21
kaynak kullanıcı

oy
4

Bir süre aynı soruyla mücadele ve sadece ben başkasının bu soruya karşısında dolaşır durumda ne yapıyorum paylaşmak istedik.

Birincisi, kendimi benim modülünde tüm dosyaları beyan eden bir referans dosyası tanımlanır:

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

Dosya içinde belirtilen yollar referans dosyası kendisi (konumuna göre olduğuna dikkat _contacts.tsbir farklı olarak,) .jsreferans dosyası. Benim dizin yapısı aşağıdaki gibidir:

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

Geri referansa dosyasının kendisinin. İlk satır böyle çizgi, anı veya bir var diğer varolan kitaplık olarak modülü tarafından kullanılan dış kütüphaneler, tüm listeleyen ayrı referans dosyası içeren .d.tsiçin tanım dosyası. Kalan satırlar modülünü oluşturan dosyalardır.

modülün bir parçası olan her dosya içinde, yukarıdaki dosyaya başvurmak:

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

Benzer şekilde, tüm modülleri listelemek için tek bir referans dosyası oluşturabilirsiniz:

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

Ve sadece kaynak dosyalarından bu işaret ediyor.

Bu da, ayrı dosyalarda olmanın yayılan kod sorunu çözmez. Bu sorun için tek bir kaynak dosyası içine birden fazla dosya donatılacak yeteneğine sahip bir JavaScript küçültme aracı kullanıyorum. (henüz o kısmı ile çok aşina olmayan) bir AMD modül olarak çalışmak için derleme ayarları ve kullanım durumu ihtiyaçlarına bağlı olarak, oluşturulan kodun çevresindeki bazı sarıcı uygulamak gerekebilir.

Cevap 13/12/2012 saat 00:12
kaynak kullanıcı

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