Функция контроллера угловой директивы Typescript

У меня проблема с написанием угловых директив в машинописном тексте. Я хочу написать свои директивы, используя классы машинописного текста. Все работает отлично, кроме функции контроллера.

class myDirective implements ng.IDirective{

public priority :number = 999;
public require :String[] = ["ngModel","myDirective"];

public controller(){
    var test = 1;
    return {
      reset : function(){
         test = 0;
  }
    }
}

public link($scope: ng.IScope, elm: JQuery, attr: ng.IAttributes, ctrlArray: any){
    var controller;
    controller = ctrlArray[1];
    controller.reset();
}

static factory(): ng.IDirectiveFactory{
    var directive = () => new myDirective();
    return directive;
}
}
export = myDirective;

Но при запуске этого в angular я получаю «undefined не является функцией», когда controller.reset() вызывается внутри функции ссылки. Когда я проверяю контроллер, я просто получаю прототип объекта, функция сброса не определена.

Когда я пишу свою директиву таким образом, она работает.

function myDirective(): ng.IDirective{
return {
    priority: 999,
    require: ["ngModel","myDirective"],
    controller: function(){
        var test = 1;
        this.reset = function(){
            test = 0;
        }
    },
    link: function($scope: ng.IScope, elm: JQuery, attr: ng.IAttributes, ctrlArray: any){
        var controller;
        controller = ctrlArray[1];
        controller.reset();
    }
}
}
export = myDirective;

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

return {
      reset : function(){
         test = 0;
  }
    }

в функции, которую я использую

this.reset = function(){
            test = 0;
        }

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


person siemprepe    schedule 16.04.2015    source источник
comment
Думаю можно сделать так.reset =› { this.test = 0}; в тестскрипте.   -  person accordionfolder    schedule 14.06.2015


Ответы (1)


Это директивный дизайн, который мы использовали:

export class FooDirectiveController {

    static $inject = ['$element', '$scope'];
    constructor(public $element: JQuery, public $scope: FooDirectiveScope) {
        $scope.vm = this;

        // Any Jquery access goes here. Use $element

        // Setup any $watch on $scope that you need
    }
}

export interface FooDirectiveScope extends ng.IScope {
    bar: string;

    // Local design only
    vm: FooDirectiveController;
}

dustApp.directives.directive('foo', function (): ng.IDirective {
    return {
        restrict: 'E',
        scope: {
            // NOTE : see documentation in type information
            bar: '='
        },
        templateUrl: 'fooDirective.html',
        controller: FooDirectiveController
    };
});

Таким образом, ваш контроллер строго типизирован, а объект определения директивы является тупым (и, возможно, совместимым с angular 2).

person basarat    schedule 16.04.2015
comment
Спасибо, кажется, это помогает. Любая идея, почему другой код не работает? - person siemprepe; 16.04.2015
comment
github.com/angular/angular. js/blob/v1.4.7/src/ng/ Эта строка является причиной. Функция вызывается с javascript fn.apply(null, arguments) Итак, в этом контексте это становится нулевым. - person geekdenz; 21.10.2015