Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 将服务传递给自定义指令中的命名链接函数_Angularjs_Angularjs Directive - Fatal编程技术网

Angularjs 将服务传递给自定义指令中的命名链接函数

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

只要可能,我更喜欢使用命名函数。但是我似乎不知道如何在自定义指令中为link函数使用命名函数

以下是有效的方法:

.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服务仅在此范围内定义,,,您不能从外部调用它