2015-08-31 2 views
6

Я работаю с Aurelia и Typcript, и я пытаюсь достичь следующего: иметь базовый класс с именем Parent, расширить этот класс в классе с именем Child, а затем ввести экземпляр Child в другой класс. Вот установка:Aurelia & Bookscript инъекции и наследование

//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; 
    } 
} 

Однако, когда я делаю это и экземпляр Home, я получаю следующее сообщение об ошибке:

Uncaught SyntaxError: Unexpected token < 

вместе с ERROR [app-router] Router navigation failed, and no previous location could be restored.

Теперь, после первой ошибки, Uncaught SyntaxError: Unexpected token < дает мне ссылка на file1.js на первой строке. (что странно содержит html-код из индекса приложения).

Теперь, если я беру инъекции из file3 и сделать что-то вроде этого:

//@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; 
    } 
} 

я получаю точно такую ​​же ошибку, так что это, кажется, не быть связаны инъекции.

Итак, как я могу получить базовый класс с именем Parent, расширьте этот класс в классе с именем Child, а затем введите экземпляр Child в другой класс?

Или что-то в моем подходе, что не так?

Спасибо!

ОБНОВЛЕНИЕ: простой факт наличия вызова для new Child() бреет все, это не имеет значения, если он вызывается при загрузке страницы, в конструкторе или если он находится в методе на кнопке , При загрузке он ломается.

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

Теперь, если я двигаю Child класс в том же файле, как Home и file3 выглядит следующим образом:

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; 
    } 
} 

и я его экземпляр, как это работает. Однако, когда я пытаюсь внедрить его, так:

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; 
    } 
} 

я получаю: inner error: Error: key/value cannot be null or undefined. Are you trying to inject/register something that doesn't exist with DI?

В конце концов, я хочу, чтобы иметь их в отдельных файлах, но это начало заставить его работать так :) Благодаря!

+0

Вы пытались установить полный 'абсолютный путь' в' файл1'? Что-то вроде 'absolute/path/to/file1'? –

+0

Также посмотрите на "@autoInject" –

ответ

3

Ok, так что Машинопись компилятор находит file1, потому что он находится в файле .csproj поэтому он не нужен полный путь, но во время выполнения, то Aurelia framework находит файл (после того, как код машинопись является transpiled) что-то вроде localhost/file1.js. Таким образом, у вас есть 2 возможности: либо создайте в папке typings (при условии, что вы используете системную модульную систему AMD), в которой устанавливаются абсолютные пути для ваших описаний типов или всегда записываются полный путь при импорте пользовательских типизаций.