Can I inject a service into a directive in AngularJS?

后端 未结 3 1345
深忆病人
深忆病人 2020-11-27 09:44

I am trying to inject a service into a directive like below:

 var app = angular.module(\'app\',[]);
 app.factory(\'myData\', function(){
     return {
             


        
相关标签:
3条回答
  • 2020-11-27 10:25

    Change your directive definition from app.module to app.directive. Apart from that everything looks fine. Btw, very rarely do you have to inject a service into a directive. If you are injecting a service ( which usually is a data source or model ) into your directive ( which is kind of part of a view ), you are creating a direct coupling between your view and model. You need to separate them out by wiring them together using a controller.

    It does work fine. I am not sure what you are doing which is wrong. Here is a plunk of it working.

    http://plnkr.co/edit/M8omDEjvPvBtrBHM84Am

    0 讨论(0)
  • 2020-11-27 10:35

    You can do injection on Directives, and it looks just like it does everywhere else.

    app.directive('changeIt', ['myData', function(myData){
        return {
            restrict: 'C',
            link: function (scope, element, attrs) {
                scope.name = myData.name;
            }
        }
     }]);
    
    0 讨论(0)
  • 2020-11-27 10:46

    You can also use the $inject service to get whatever service you like. I find that useful if I don't know the service name ahead of time but know the service interface. For example a directive that will plug a table into an ngResource end point or a generic delete-record button which interacts with any api end point. You don't want to re-implement the table directive for every controller or data-source.

    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)
    

    now your 'anonymous' service is fully available. If it is ngResource for example you can then use the standard ngResource interface to get your data

    For example:

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

    I have found this technique to be very useful when making elements that interact with API endpoints especially.

    0 讨论(0)
提交回复
热议问题