2015-08-31 32 views
6

Aurelia ve Typescript ile çalışıyorum ve şu şeyi elde etmeye çalışıyorum: Parent adında bir temel sınıf var, bu sınıfı Child adlı bir sınıfta genişlet ve sonra Child örneğini enjekte et başka bir sınıf. İşte tuzak: Bunu ve Home örneğini zaman, AncakAurelia & Typescript enjeksiyonu ve kalıtım

//file1 

export class Parent { 
    constructor() { 
     debugger; 
    } 
} 

//file2 
import {Parent} from "file1"; 
export class Child extends Parent { 
    constructor() { 
     super(); 
     debugger; 
    } 
} 

//file3 
import {inject} from "aurelia-framework"; 
import {Child} from "file2"; 

@inject(Child) 
export class Home { 
    private child: Child; 
    constructor(_child: Child) { 
     this.child = _child; 
     debugger; 
    } 
} 

, aşağıdaki hatayı alıyorum:

Uncaught SyntaxError: Unexpected token < 

boyunca Şimdi ERROR [app-router] Router navigation failed, and no previous location could be restored.

, ilk hata ile, Uncaught SyntaxError: Unexpected token < verir İlk satırda file1.js referansı. (garip bir şekilde uygulama dizininden html kodunu içerir). Ben file3 dışına enjeksiyonu almak ve böyle bir şey yaparsanız

Şimdi:

//@inject(Child) 
export class Home { 
    private child: Child; 
    constructor() { 
     this.child = new Child(); //here I don't inject, I just 
//instantiate a new object of type Child - still the same error 
     debugger; 
    } 
} 

o enjeksiyon ilgili olarak görünmüyor yüzden, tam olarak aynı hatayı alıyorum.

Peki, Parent adında bir temel sınıfıma sahip olabilirim, bu sınıfı Child adlı bir sınıfta genişletebilir ve sonra başka bir sınıfta Child örneğini enjekte edebilir?

Ya da benim yaklaşımımda doğru olmayan bir şey var mı?

Teşekkürler!

GÜNCELLEŞTIRME: new Child() numaralı çağrıya sahip olmanızın basit bir gerçeği, herşeyi bozar, sayfanın yüklenmesinde, yapıcısında çağrılırsa veya bir düğmedeki bir yöntemde olursa önemli değildir . Yükleme sırasında kırılır.

buttonMethod(){ 
    var x = new Child(); //it breakes the same way 
} 

Şimdi Home aynı dosyada Child sınıf taşırsanız ve file3 şuna benzer:

import {inject} from "aurelia-framework"; 
import {Parent} from "file1"; 

export class Home { 
    child: Child; 
    constructor() { 
     this.child = new Child(); 
     debugger; 
    } 
} 


export class Child extends Parent { 
    constructor() { 
     super(); 
     debugger; 
    } 
} 

ve bunun işe yaradığını bunu böyle örneğini. Ancak, ben çalıştığınızda bu yüzden, bunu enjekte etmek: Sonunda

inner error: Error: key/value cannot be null or undefined. Are you trying to inject/register something that doesn't exist with DI? ben ayrı dosyalarda onları olsun istiyorum, ama bir başlangıç ​​o kadar işe yapıyor :) :

import {inject} from "aurelia-framework"; 
import {Parent} from "file1"; 

@inject(Child) 
export class Home { 
    child: Child; 
    constructor(_child: Child) { 
     this.child = _child; 
     debugger; 
    } 
} 


export class Child extends Parent { 
    constructor() { 
     super(); 
     debugger; 
    } 
} 

alıyorum Teşekkürler!

+0

Tüm 'mutlak yolu' dosya1'e ayarlamayı denediniz mi? Mutlak/yol/to/dosya1 gibi bir şey? –

+0

Ayrıca, "@otokuInject" e bakınız. –

cevap

3

Tamam o tam yolunu gerekmez yüzden .csproj dosyada olduğu için, bu nedenle typescript derleyici file1 bulur ama zamanında, Aurelia framework dosyayı bulur localhost/file1.js gibi bir şey (typescript kodu transpiled sonra). Yani 2 seçeneğiniz var: typings klasöründe tsd.json klasörünü oluşturun (AMD modül sistemini kullandığınızı varsayarak), yazı dizini tanımlarınızın mutlak yollarını belirleyebilir veya her zaman özel yazımları içe aktarırken tam yol yazabilirsiniz.