我可以注入一个服务到指令吗?

我正在试图注入一个服务,如下所示:

var app = angular.module('app',[]); app.factory('myData', function(){ return { name : "myName" } }); app.directive('changeIt',function($compile, myData){ return { restrict: 'C', link: function (scope, element, attrs) { scope.name = myData.name; } } }); 

但是,这是返回给我一个错误Unknown provider: myDataProvider 。 有人可以看看代码,并告诉我,如果我做错了什么?

你可以在Directive上进行注入,看起来就像在其他地方一样。

 app.directive('changeIt', ['myData', function(myData){ return { restrict: 'C', link: function (scope, element, attrs) { scope.name = myData.name; } } }]); 

将您的指令定义从app.module更改为app.directive 。 除此之外,一切看起来都很好。 顺便说一句,你很less要注入一个服务到指令。 如果你正在向你的指令注入一个服务(通常是一个数据源或模型)(这是一种视图的一部分),那么你正在build立一个视图和模型之间的直接耦合。 您需要使用控制器将它们连接在一起。

它确实工作正常。 我不确定你在做什么是错的。 这是它的一大块工作。

http://plnkr.co/edit/M8omDEjvPvBtrBHM84Am

您也可以使用$ inject服务来获得您喜欢的任何服务。 如果提前不知道服务名称,但是知道服务接口,我觉得这很有用。 例如,一个将表格插入到ngResource结束点的指令或一个与任何api结束点交互的通用删除loggingbutton。 您不希望为每个控制器或数据源重新实现table指令。

template.html

 <div my-directive api-service='ServiceName'></div> 

my-directive.directive.coffee

 angular.module 'my.module' .factory 'myDirective', ($injector) -> directive = restrict: 'A' link: (scope, element, attributes) -> scope.apiService = $injector.get(attributes.apiService) 

现在你的“匿名”服务是完全可用的。 如果是ngResource,例如你可以使用标准的ngResource接口来获取你的数据

例如:

 scope.apiService.query((response) -> scope.data = response , (errorResponse) -> console.log "ERROR fetching data for service: #{attributes.apiService}" console.log errorResponse.data ) 

我发现这个技术在制作与API端点交互的元素时非常有用。