2016-01-19 3 views
0

У меня проблема относительно механизма впрыска угловой зависимости. Я написал директиву в отдельном модуле, который делает некоторые аккуратные вещи на datatable. Я использую машинопись и моя директива выглядит следующим образом:Неисправность впрыска AngularJS в модуле

export class MdListControls implements angular.IDirective { 
    public templateUrl = "/app/templates/mdListControls.html"; 
    public static instance(): any { 
    return new MdListControls(); 
    }; 

    public restrict = 'E'; 
    public transclude = true; 
    public replace = true; 
    public scope = { 
    grid: '=', 
    }; 
    public controller = "mdListControlsController" 
    public controllerAs = "vm"; 

    public link = function (scope: angular.IScope, element: angular.IAugmentedJQuery, attrs: angular.IAttributes) { 

    }; 
} 

Мой контроллер выглядит примерно так:

export class MdListControlsController { 
    static $inject = ['scope'] 
    constructor($scope: angular.IScope){ 
    //Setup the constructor 
    } 
    //Here goes the controller Logic 
} 

Я регистрируя директиву и контроллер на новый модуль следующим образом:

angular.module("base.directives.mdListControls", []) 
    .controller("mdListControlsController", MdListControlsController) 
    .directive("mdListControls", function() { return MdListControls.instance() }); 

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

Argument 'mdListControlsController;' is not a function, got undefined 

Это не совсем похоже на проблему с инъекцией зависимостей. Но когда я зарегистрировать контроллер на само приложение (которое получает вводил «base.directives.mdListControls» Module), как так

app.controller("mdListControlsController", MdListControlsController); 

все работает отлично, и контроллер получает введен правильно в директиве.

Кто-нибудь знает, что я здесь делаю неправильно? Спасибо за помощь!

+0

Я не знаю TypeScript, но проблема заключается в порядке выполнения JS. MdListControlsController недоступен, когда ваш контроллер регистрируется как angular.module («base.directives.mdListControls», []) .controller («mdListControlsController», MdListControlsController) – Prashant

+0

Я тоже не знаю TypeScript. Что произойдет, если в объявлении вашего контроллера вы выполните .controller («mdListControlsController», function() {return MdListControlsController})? –

+0

Может быть, глупый вопрос. Но вы, похоже, экспортируете MdListControlsController. Вы также импортируете его в верхней части файла вашего директивного модуля? –

ответ

0

В вашем классе MdListControls попробуйте указать класс контроллера, а не имя контроллера.

...  
public scope = { 
    grid: '=', 
    }; 
public controller = MdListControlsController 
public controllerAs = "vm"; 
... 
+0

Спасибо за ваш намек. Это очевидно работает, потому что «инъекция» знает, что происходит на уровне TypeScript. Но теперь угловой вообще не требует инъекции зависимости. Однако, я думаю, мне придется пойти с этим решением. – hoffmax91

Смежные вопросы