Недавно я начал рефакторинг одного из проектов Angular, над которым я работаю с помощью TypeScript. Использование классов TypeScript для определения контроллеров очень удобно и хорошо работает с минифицированными файлами JavaScript благодаря свойству static $inject Array<string>
. И вы получаете довольно чистый код без разделения зависимостей Angular от определения класса:
module app {
'use strict';
export class AppCtrl {
static $inject: Array < string > = ['$scope'];
constructor(private $scope) {
...
}
}
angular.module('myApp', [])
.controller('AppCtrl', AppCtrl);
}
Прямо сейчас я ищу решение для обработки аналогичного случая для определения директивы. Я нашел хорошую практику для определения директив как функций:
module directives {
export function myDirective(toaster): ng.IDirective {
return {
restrict: 'A',
require: ['ngModel'],
templateUrl: 'myDirective.html',
replace: true,
link: (scope: ng.IScope, element: ng.IAugmentedJQuery, attrs: ng.IAttributes, ctrls) =>
//use of $location service
...
}
};
}
angular.module('directives', [])
.directive('myDirective', ['toaster', myDirective]);
}
В этом случае я вынужден определить зависимости Angular в определении директивы, что может быть очень подвержено ошибкам, если определение и класс TypeScript находятся в разных файлах. Как лучше всего определить директиву с помощью машинописного текста и механизма $inject
, я искал хороший способ реализовать интерфейс TypeScript IDirectiveFactory
, но найденные решения меня не удовлетворили.