AngularJS指令,通过指令属性调用服务

AngularJS directive, Call service by directive attribute

我正在尝试创建一个 angular 指令来调用服务方法来检查不断变化的数据库。

这是我的 HTML:

<div my-directive="Panel.check"></div>

我要的是:

调用"Panel"服务的"check"方法。指令对服务及其方法一无所知。它只是解析属性并绑定它们,或者如果必须注入,请告诉我解决方案。

我有:

appDirectives.directive('myDirective', function($parse) {

var directiveOnObject = {
    restrict: 'A',
    scope: { method:'&myDirective' },
    link: function(scope,element,attrs) {

        var panel = scope.method;

        console.log(panel());
    }
};  

return directiveOnObject;

});

Scope 方法应该获取 "Panel" 的实例并调用它的 "check" 方法。

有什么解决办法吗?请解释。

首先,您需要在指令中注入服务:

appDirectives.directive('myDirective', ['$parse', 'myService', function($compile, myService){
 // here use 'myservice' to get access to variables and methods of the service
}]);

您需要能够访问控制器中的 Panel 服务,例如:

angular.module('app').controller('Foo', function($scope, Panel) {
  $scope.Panel = Panel;
});

现在您可以使用您的指令,但是当您使用 & 传递函数时,您还需要放置括号:

<div my-directive="Panel.check()"></div>

没有它就不行。其余代码保持不变。

检查一下here

编辑:如果您只需要您的指令使用一种确切的服务或一种确切的方法,请像使用 $parse 一样将服务注入指令(顺便说一句,在任何情况下都不需要) .

编辑 2:如果您要调用的服务接受参数,您需要执行以下操作:

<div my-directive="Panel.check(param1, param2)"></div>

然后在指令中,您需要将这些参数映射到您的本地对象,因此,例如(在您的指令中)您有:

link: function(scope, element, attrs) {
  var foo = 1;
  var bar = 2;
}

并且您想将这些变量作为参数传递。

首先,你需要回忆一下你是如何在 html 中命名这些参数的,具体来说它们是 param1param2 所以你需要做(在 link 函数):

scope.method({param1: foo, param2: bar});

所以对于 param1 我们通过 foo 而对于 param2 我们通过 bar.