Angular TypeScript 指令的 Link 方法不会被调用



我正在尝试实现一个基于角色的访问控制系统,其中允许的资源将在登录后从服务器加载。我可以使用原始的JavaScript代码来检查它。

angular.module('app').directive('accessControl',
[
'AuthService', function (authService) {
return {
restrict: 'A',
scope: "=",
link: function (scope, element, attrs) {
scope.canShow = function(resource) {
var allowedResources = authService.accountInfo.resources;
return allowedResources.indexOf(resource) !== -1;
}
}
}
}
]); 

但是由于我的整个应用程序都在 TypeScript 中,我一直在尝试在纯 TypeScript 中制作指令,但不幸的是我无法这样做。这是我的 TS 代码。

export class AccessControl implements ng.IDirective {
public authService: App.AuthService;
public link: (scope: ng.IScope, element: ng.IAugmentedJQuery, attrs: ng.IAttributes) => void;
constructor(authService: App.AuthService) {
this.authService = authService;
console.log('authservice: ', authService);
AccessControl.prototype.link = (scope: ng.IScope, element: ng.IAugmentedJQuery, attrs: ng.IAttributes) => {
scope["canShow"] = function (resource: string) {
// some logic
console.log('can show' + resource);
return true;
};
};
}
public static factory(): ng.IDirectiveFactory  {
var directive = (authService: App.AuthService) => {
return new AccessControl(authService);
};
directive['$inject'] = ['AuthService'];
return directive;
}
restrict = "A";
scope: "=";
}
angular.module('app').directive('accessControl', AccessControl.factory());

链接函数永远不会被调用。 任何帮助或指针将不胜感激。

我们一直将link声明为类上的公共函数。指令类不需要公共scope变量,除非您使用的是隔离作用域(在这种情况下,它将是专门传递了每个作用域变量或方法的对象)。此外,可以直接在directive上设置$inject,而无需使用括号属性表示法。以下是我们使用 TypeScript 创建指令的方式:

namespace app.directives {
export class AccessControl implements ng.IDirective {
public restrict = "A";
constructor(private authService: App.AuthService) {
console.log("authservice: ", this.authService);
}
public link(scope: ng.IScope, 
element: ng.IAugmentedJQuery, 
attrs: ng.IAttributes) {
console.log("in link function of directive", scope);
}
public static factory(): ng.IDirectiveFactory  {
var directive = (authService: App.AuthService) => {
return new AccessControl(authService);
};
directive.$inject = ["AuthService"];
return directive;
}
}
angular.module("app")
.directive("accessControl", AccessControl.factory());
}

最新更新