AngularJS & Typescript: Как назначить класс / тип в качестве контроллера директивы?

Директивы AngularJS определяют контроллер, используя:

{
  controller: function ($scope){}
}

На данный момент я не нашел способа создать класс TypeScript и назначить его свойству контроллера директивы.

То, что я хотел бы сделать, это что-то вроде

interface IDirectiveController{
    myProperty:string;
}

class DirectiveController implements IDirectiveController{
   static $injector = [$scope];
   constructor ($scope:ng.IScope){
       this.myProperty = 'default';
   }

   public myProperty:string;
}


var directive:ng.IDirective =
{
   controller:DirectiveController;
}
return directive;

Еще лучше, если бы можно было использовать фабричную функцию, которая позволила бы мне создать и вернуть новый экземпляр контроллера, аналогично тому, как создается сама директива.

В моем шаблоне директивы я также хотел бы связать непосредственно с контроллером вместо того, чтобы присваивать свойства класса для $ scope.

Можно также сказать, что я хотел бы иметь возможность назначать контроллеры директивам способом, аналогичным назначению контроллера с использованием myController as ContollerType синтаксис, который доступен в шаблоне.

2 ответа

Решение

Я полагаю, что вы могли бы сделать что-то подобное в вашей директиве:

...
controller: DirectiveController,
controllerAs: 'myCtrl'
...

Тогда angular должен создать экземпляр вашего класса с его конструктором, и вы можете обратиться к нему в шаблоне с помощью myCtrl

Просто сделайте то, что вы сделали бы в отсутствие директивы, то есть:

class DirectiveController{
   static $inject = ['$scope']; // fixed a few typos here
   constructor ($scope){
       $scope.vm = this;        // this is the pattern I recommend for all controllers
       this.myProperty = 'default';
   }

   public myProperty:string;
}

Подробнее об этом шаблоне читайте на http://www.youtube.com/watch?v=WdtVn_8K17E&hd=1.

Другие вопросы по тегам