AngularJS의 지시문에 서비스를 삽입 할 수 있습니까?


234

아래와 같은 지시문에 서비스를 주입하려고합니다.

 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있습니다. 누군가 코드를 살펴보고 내가 잘못하고 있는지 말해 줄 수 있습니까?

답변:


388

지시어에 주입 할 수 있으며 다른 곳과 마찬가지로 보입니다.

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

13
코드를 축소 한 후에도 작동하기 때문에 이것이 더 나은 솔루션이라고 생각합니다.
czerasz

5
반환 {} 전에 '_myData = myData'를 추가 한 다음 링크 함수 내에서 _myData로 객체를 참조해야했습니다.
Jelling

감사합니다 @Jelling. 나는 똑같은 일을해야했다. 왜 누군가가 우리에게 이유를 말할 수 있는지 궁금합니다 ...?
sfletche

6
지시문에 $ compile을 삽입해야하는 특별한 이유가 있습니까? 어디서나 사용되지 않는 것 같습니다.
gru

4
지시문 호출 외부에서 링크 함수를 작성하려는 경우 주입에 대한 솔루션이 있습니까?
ThinkBonobo

19

지시문 정의를에서 app.module로 변경하십시오 app.directive. 그 외에도 모든 것이 잘 보입니다. Btw, 지시문에 서비스를 주입 해야하는 경우는 거의 없습니다. 서비스 (보통 데이터 소스 또는 모델)를 지시문 (보기의 일부)에 주입하는 경우 뷰와 모델 사이에 직접 연결이 작성됩니다. 컨트롤러를 사용하여 서로 배선하여 분리해야합니다.

잘 작동합니다. 나는 당신이 무엇을하고 있는지 잘 모르겠습니다. 여기에 많은 것들이 작동합니다.

http://plnkr.co/edit/M8omDEjvPvBtrBHM84Am


예를 들어 주시겠습니까?
예외

@Exception 코드를 바이올린에 넣을 수 있습니까? 코드가 작동하지 않는 이유를 살펴보고 해결할 수 있습니다.
ganaraj

@Exception은 코드 작동을 보여주는 작동하는 플 런크를 추가했습니다.
ganaraj

3
방금 뭔가를 발견했습니다. 함수 매개 변수에서 주입을 정의 function($location) { ...하지만 실제로 $location함수 내부를 참조하지 않으면 AngularJS는 주입을 수행하지 않습니다. 이 동작을 알 수있는 유일한 시간은 디버거 내부입니다.
Walter Stabosz

13
귀하의 "결합 된"의견에 동의하지 않습니다. 우리는 이미 컨트롤러와 서비스를 전 세계적으로 결합하고 있습니다. 런타임에 서비스 구현을 프로그래밍 방식으로 대체 할 수는 없습니다. 이는 단일 컨트롤러가 단일 서비스를 얻는 것을 의미합니다. 그러나-지시문은 페이지의 태그마다 구성을 분리하므로 다른 지시문 인스턴스에 다른 서비스를 사용할 수 있습니다. 나에게 이것은 덜 분리 된 것 같습니다.
guy mograbi

11

$ inject 서비스를 사용하여 원하는 서비스를 얻을 수도 있습니다. 서비스 이름을 미리 모르지만 서비스 인터페이스를 알고 있다면 유용합니다. 예를 들어 테이블을 ngResource 엔드 포인트 또는 임의의 api 엔드 포인트와 상호 작용하는 일반 삭제 레코드 단추에 연결하는 지시문이 있습니다. 모든 컨트롤러 또는 데이터 소스에 대해 테이블 ​​지시문을 다시 구현하고 싶지는 않습니다.

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 엔드 포인트와 상호 작용하는 요소를 만들 때이 기술이 매우 유용하다는 것을 알았습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.