使用TypeScript和$inject机制定义AngularJS指令

前端之家收集整理的这篇文章主要介绍了使用TypeScript和$inject机制定义AngularJS指令前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
最近我开始重构我正在使用TypeScript工作的Angular项目之一。使用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类在不同的文件中,这可能非常容易出错。什么是用typescript和$ inject机制定义指令的最好方法,我正在寻找一个好的方法来实现TypeScript IDirectiveFactory接口,但是我不满意我发现的解决方案。

使用类和继承自ng.IDirective是使用TypeScript的方法
class MyDirective implements ng.IDirective {
    restrict = 'A';
    require = 'ngModel';
    templateUrl = 'myDirective.html';
    replace = true;

    constructor(private $location: ng.ILocationService,private toaster: ToasterService) {
    }

    link = (scope: ng.IScope,ctrl: any) => {
        console.log(this.$location);
        console.log(this.toaster);
    }

    static factory(): ng.IDirectiveFactory {
        const directive = ($location: ng.ILocationService,toaster: ToasterService) => new MyDirective($location,toaster);
        directive.$inject = ['$location','toaster'];
        return directive;
    }
}

app.directive('mydirective',MyDirective.factory());

相关答案:http://stackoverflow.com/a/29223360/990356

猜你在找的Angularjs相关文章