Angularjs 将服务传递给自定义指令中的命名链接函数
只要可能,我更喜欢使用命名函数。但是我似乎不知道如何在自定义指令中为link函数使用命名函数 以下是有效的方法:Angularjs 将服务传递给自定义指令中的命名链接函数,angularjs,angularjs-directive,Angularjs,Angularjs Directive,只要可能,我更喜欢使用命名函数。但是我似乎不知道如何在自定义指令中为link函数使用命名函数 以下是有效的方法: .directive('myDirective', myDirective); function myDirective($log) { return { restrict: 'E', scope: { myData: '=', forms: '=' }, templateUrl: 'myDirective.template.html', con
.directive('myDirective', myDirective);
function myDirective($log) {
return {
restrict: 'E',
scope: {
myData: '=',
forms: '='
},
templateUrl: 'myDirective.template.html',
controller: myDirectiveController, // Not shown in this example
controllerAs: 'vm',
bindToController: true,
link: function ($scope, elem, attrs) {}
$log.debug('testing');
}
以下是不起作用的:
.directive('myDirective', myDirective);
/* @ngInject */
function myDirective($log) {
return {
restrict: 'E',
scope: {
myData: '=',
forms: '='
},
templateUrl: 'myDirective.template.html',
controller: myDirectiveController, // Not shown in this example
controllerAs: 'vm',
bindToController: true,
link: myLinkFunction
}
function myLinkFunction($scope, elem, attrs) {
$log.debug('testing');
}
将$log服务传递到命名函数也不起作用:
function myLinkFunction($scope, elem, attrs, $log) {
$log.debug('testing');
}
这可能吗?您无法将服务注入链接函数,因此第二种方法无效,但第一种方法应能正常工作 是否尝试使用$inject,,在函数声明之前添加此行
myDirective.$inject = ["$log"]
试试这个,告诉我,,不可能
link函数已设置参数,无法从DDO*中提取,并且仍然可以访问DI的值,因为您无法将内容注入到link步骤中
如果要从DDO的返回值中提取,可以执行以下操作:
app.directive('...', function ($log) {
function linkerFn () {
$log('something');
}
return {
link: linkerFn
};
});
*:指令定义对象这就是变量作用域在JS中的工作方式。您不能期望myLinkFunction
将您的指令假定为父变量范围,因为myLinkFunction
是在外部定义的。此外,您不能将链接函数插入,也不能仅仅添加一个附加参数并将其传递到那里。但以下方法会奏效
function myDirective($log) {
return {
...
// there are 5 mandatory parameters for link
link: function (scope, elem, attrs, ctrl, transcludeFn) {
return myLinkFunction(scope, elem, attrs, ctrl, transcludeFn, $log);
},
...
}
function myLinkFunction(scope, elem, attrs, ctrl, transcludeFn, $log) {
$log.debug('testing');
}
更简洁的方法是使控制器包含指令所需的所有内容:
function myDirective() {
return {
...
controller: function ($log) {
this.$log = $log;
},
controllerAs: 'vm',
bindToController: true,
link: myLinkFunction
}
function myLinkFunction($scope, elem, attrs, ctrl) {
ctrl.$log.debug('testing');
}
虽然它在没有控制器的情况下工作得最好,但在其他情况下会污染范围。幸运的是,在不使用Controllera的情况下,嵌套指令之间的通信方式还有其他选择。这是不可能的。不能在链接函数中插入任何内容。这就是指令工厂构造函数的作用。只需在指令构造函数中定义link函数,就可以访问$log。这可能就是你正在做的,但是“这是不起作用的东西:”什么是错误?OP正在使用@ngInject
ng annotate将处理它,不需要$inject。此外,您还需要显式注释,仅用于缩小安全性。我知道,但有时,会有一些配置来停止自动注释,我认为您可能有这些配置,但我还注意到,您在指令范围外声明了链接函数,,$log服务仅在此范围内定义,,,您不能从外部调用它