AngularJS打字稿指令

Alg*_*kas 11 directive angularjs typescript

使用Typescript创建嵌套指令时遇到问题.我可以用简单的AngularJs来做:http://plnkr.co/edit/UruTqEdMnqNT5wjxcQNC?p = preview ,

但使用TypeScript它给我"无控制器"错误消息.

/// <reference path="../../Scripts/AngularJs/Typings/angular.d.ts" />

export class directiveA {
    public static $inject: Array<string> = [];
    constructor() {
        var directive: ng.IDirective = {};
        directive.priority = 0; 
        directive.restrict = "A";
        directive.scope = {};
        directive.transclude = true;
        directive.templateUrl = "otherTemplate.html";
        directive.replace = true;
        directive.controller = function ($scope, $element) {
            this.flip = function () {
                $element.toggleClass("flipped");
             }
        }
        directive.replace = true;

        return directive;
    }
} 


export class directiveB{
    public static $inject: Array<string> = [];
    constructor() {
        var directive: ng.IDirective = {};
        directive.require = "^directiveA";
        directive.priority = 1;
        directive.restrict = "A";
        directive.scope = {
            simplrSide : "@"
        };
        directive.transclude = true;
        directive.templateUrl = "templeUrl.html";
        directive.link = function (scope, iElement, iAttrs, simplrEditable) {
            scope.flip = function () {
                simplrEditable.flip();
            }
        }
        directive.replace = true;
        return directive;
    }
}
Run Code Online (Sandbox Code Playgroud)

我不知道它是否相关,但我使用AMD Require.JS进行脚本加载

bas*_*rat 14

假设您将这些注册为:

import mod = require('yourfile')
youmodule.directive('directiveA',mod.directiveA);
youmodule.directive('directiveB',mod.directiveB);
Run Code Online (Sandbox Code Playgroud)

只要你的html看起来像这样就可以了:

<div directiveA>
  <div directiveB>
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

除此之外的几个笔记:

使用函数作为指令定义.

这是因为没有new运算符就会调用指令(与控制器不同).所以如果你有类似的东西:

class Test{
    foo = "EAC";
    constructor(){
        var directive:any = {}; 
        directive.restrict = this.foo;
    }
} 
Run Code Online (Sandbox Code Playgroud)

它编译为不正确的 JavaScript.由于在没有new运算符的情况下调用函数Test,这意味着this引用window而不是类的实例.所以你不能使用构造函数之外定义的任何东西.我建议像:

function foo():ng.IDirective{
    return {
        restrict: 'EAC';    
    }
}
Run Code Online (Sandbox Code Playgroud)

这种方式打字稿将帮助您为角度编写正确的javascript而不是以错误的方式指向您.我会在某个时候制作关于此的视频

使用控制器的类 也可以使用new运算符调用指令内的控制器.与外部控制器相同:http://www.youtube.com/watch?v = WdtVn_8K17E再次让打字稿帮助您this了解控制器定义内部的含义.另外,你可以在子指令中使用控制器的类型(对于类型安全和推理):

link: function (scope, iElement, iAttrs, simplrEditable:YourControllerClass)
Run Code Online (Sandbox Code Playgroud)

为了注入指令函数, 我仍然使用$ inject.我有以下接口定义:

interface Function{
    $inject:string[]
}
Run Code Online (Sandbox Code Playgroud)

这意味着您可以:

foo.$inject = ['$compile']; // e.g
Run Code Online (Sandbox Code Playgroud)


Alg*_*kas 4

该问题与 Typescript 无关,而是与 AngularJS 指令相关。将templateUrl更改为模板并使用内联代码有助于解决错误。这是 AngularJS 问题,更多信息: https: //github.com/angular/angular.js/issues/1903 希望他们将来能解决这个问题!

export class directiveA {
    public static $inject: Array<string> = [];
    constructor() {
        var directive: ng.IDirective = {};
        directive.priority = 0; 
        directive.restrict = "A";
        directive.scope = {};
        directive.transclude = true;
        directive.template = "<div>Your content</div>";
        directive.replace = true;
        directive.controller = function ($scope, $element) {
            this.flip = function () {
               //Some func
             }
        }
        directive.replace = true;

        return directive;
    }
} 
Run Code Online (Sandbox Code Playgroud)

  • `this.app.directive("myDirective", () =&gt; 新指令A());` (2认同)