2016-07-18 4 views
0

Я изучаю, как создавать пользовательские директивы.Использование служебной внутренней директивы?

Моя служба выглядит следующим образом:

myApp.service('myService',function(){ 
    this.myFunction=function(myParam){ 
     // do something 
    } 
}); 

Вот моя директива:

myApp.directive('myDirective',function(myService){ 
    return { 
     restrict: 'E', 
     scope: { 
      param: '=myParam', 
     }, 
     template: '<button ng-click="myService.myFunction(param)">Do action</button>', 
    } 
}); 

В HTML, когда я использую <my-directive my-param="something"></my-directive> он правильно делает, как кнопка. Однако, когда я нажимаю на него, myService.myFunction, не выполняется.

Я полагаю, что я делаю что-то неправильно. Может ли кто-нибудь дать мне направление? Я предполагаю, что это имеет какое-то отношение к сфере действия директивы.

ответ

1

Служба не будет доступна непосредственно внутри шаблона. Вам нужно будет использовать функцию, прикрепленную к директиве scope, и вызвать функцию обслуживания из этой функции.

myApp.directive('myDirective',function(myService){ 
    return { 
     restrict: 'E', 
     scope: { 
      param: '=myParam', 
     }, 
     template: '<button ng-click="callService(param)">Do action</button>', 
     link: function(scope, element, attrs) { 
      scope.callService = function() { 
       myService.myFunction(); 
      } 
     } 
    } 
}); 
+1

Это, очевидно, работает, но особенно, когда вы пишете тесты этой директивы довольно трудно проверить. Когда вы пишете всю логику в контроллере, она становится проще в обслуживании и проще тестировать. Поэтому я всегда рекомендую использовать контроллер для вашей логики вместо функции link. – Pjetr

1

Это не работает, потому что в вашем примере директива фактически не знает, что это myService. Вы должны явно вводить его .: например

myApp.directive('myDirective', ['myService', function(myService){ ... }]); 

Смотрите также это question или это question.

0

Вы можете вводить услугу в контроллере, а затем вызвать эту функцию внутри шаблона:

Inject myService в контроллер:

myApp.controller("ctrl", function($scope, myService) { 
    $scope.doService = function(myParam) { 
     return myService.myFunction(myParam); 
    }; 
}); 

вызова doService метод контроллера внутри шаблона:

myApp.directive('myDirective',function(){ 
    return { 
     restrict: 'E', 
     scope: { 
      param: '=myParam', 
     }, 
     template: '<button ng-click="doService(param)">Do action</button>', 
    } 
}); 
0

Вы должны использовать контроллер для выполнения всех модификаций DOM.
Смотрите эту plunkr: https://plnkr.co/edit/HbfD1EzS0av5BG6NgtIv?p=preview

.directive('myFirstDirective', [function() { 
    return { 
    'restrict': 'E', 
    'controller': 'MyFirstController', 
    'controllerAs': 'myFirstCtrl', 
    'template': '<h1>First directive</h1><input type="text" ng-model="myFirstCtrl.value">' 
    }; 
} 
Смежные вопросы