AngularJS-함수를 지시문에 전달


160

angularJS 예제가 있습니다.

<div ng-controller="testCtrl">

<test color1="color1" updateFn="updateFn()"></test>
</div>
 <script>
  angular.module('dr', [])
.controller("testCtrl", function($scope) {
    $scope.color1 = "color";
    $scope.updateFn = function() {
        alert('123');
    }
})
.directive('test', function() {
    return {
        restrict: 'E',
        scope: {color1: '=',
                updateFn: '&'},
        template: "<button ng-click='updateFn()'>Click</button>",
        replace: true,
        link: function(scope, elm, attrs) { 
        }
    }
});

</script>
</body>

</html>

버튼을 클릭하면 경고 상자가 나타나지만 아무것도 표시되지 않습니다.

누구든지 나를 도울 수 있습니까?

답변:


243

분리 범위 지시문 내부에서 상위 범위의 컨트롤러 함수를 호출하려면 dash-separatedOP와 같이 HTML에서 속성 이름을 사용하십시오.

또한 함수에 매개 변수를 보내려면 객체를 전달하여 함수를 호출하십시오.

<test color1="color1" update-fn="updateFn(msg)"></test>

JS

var app = angular.module('dr', []);

app.controller("testCtrl", function($scope) {
    $scope.color1 = "color";
    $scope.updateFn = function(msg) {        
        alert(msg);
    }
});

app.directive('test', function() {
    return {
        restrict: 'E',
        scope: {
            color1: '=',
            updateFn: '&'
        },
        // object is passed while making the call
        template: "<button ng-click='updateFn({msg : \"Hello World!\"})'>
            Click</button>",
        replace: true,        
        link: function(scope, elm, attrs) {             
        }
    }
});

Fiddle


1
귀하의 답변에 대해 Codezilla에게 감사 드리며 지시문 "test"에서 범위를 격리하기 위해 부모 범위에서 "updateFn"함수를 바인딩하려는 경우 상황에 대해 묻고 싶습니다. 가능합니까?
user2707026

2
replace속성은 AngularJS에서 더 이상 사용되지 않습니다 : stackoverflow.com/questions/24194972/…
cdmckay

8
어떤 이유로 인수가 정의되지 않았습니다.
chovy

1
@ chovy 메소드를 다시 호출하면 인수가 사용된다고 생각합니까? 첫 번째 열린 괄호 사용법은 angular가 메소드가 전달되기를 원하는 형식 인 것 같습니다. 그러나 여기서 잘못되었을 수 있습니다.
marksyzm

1
updateFn({msg: 'my message'});지시문의 link함수 내에서 함수를 호출 할 때 해당 형식으로 객체 매핑 을 사용해야 합니다.
Brian

159

아마도 뭔가 빠졌지 만 다른 솔루션은 부모 범위 함수를 호출하지만 지시문 코드에서 인수를 전달할 수는 없습니다 . 예를 들어 고정 매개 변수 update-fn로 호출 하기 때문 입니다. 약간의 변경으로 지시어가 인수를 전달할 수 있습니다.updateFn(){msg: "Hello World"}

<test color1="color1" update-fn="updateFn"></test>

HTML은 함수 참조, 즉 ()대괄호 없이 전달합니다 .

JS

var app = angular.module('dr', []);

app.controller("testCtrl", function($scope) {
    $scope.color1 = "color";
    $scope.updateFn = function(msg) {        
        alert(msg);
    }
});

app.directive('test', function() {
    return {
        restrict: 'E',
        scope: {
            color1: '=',
            updateFn: '&'
        },
        // object is passed while making the call
        template: "<button ng-click='callUpdate()'>
            Click</button>",
        replace: true,        
        link: function(scope, elm, attrs) {       
          scope.callUpdate = function() {
            scope.updateFn()("Directive Args");
          }
        }
    }
});

따라서 위의 HTML에서 로컬 범위 callUpdate함수를 호출 하면 부모 범위에서 updateFn을 '페치'하고 지시문이 생성 할 수있는 매개 변수를 사용하여 리턴 된 함수를 호출합니다.

http://jsfiddle.net/mygknek2/


9
내가 작동하는 것에 대해 어떻게 투표를받을 수 있는지 잘 모르겠습니다. 투표를 중단하려면 의견을 남겨야합니다.
steve

7
이것은 나를 위해 일했습니다. 추가 기능을 원하지 않으면 그냥 작성하십시오ng-click="updateFn()('Directive Args')"
Graham Walters

7
아아! scope.updateFn () ( "직접 인수"); !! NOT scope.updateFn ( "Directive Args"); !!!
Phung D. An

2
이것은 실제로 더 완벽한 답변입니다!
vinesh

11
@ Ludwik11 sure-scope.updateFn이 정의되었을 때 함수를 반환하는 함수이므로 (((() ())) 이것은 html로 update-fn = "updateFn"을 통해 참조로 범위를 전달하기 때문입니다. 우리가 호출하려는 함수에. 첫 번째 ()는이 참조를 반환하기 위해 각도에 대한 호출이며, 두 번째 ()는 함수를 호출하며 매개 변수를 전달하는 곳입니다. HTH
스티브

39

'test'지시문 Html 태그에서 함수의 속성 이름은 camelCased가 아니라 대시 기반 이어야합니다 .

그래서-대신 :

<test color1="color1" updateFn="updateFn()"></test>

쓰다:

<test color1="color1" update-fn="updateFn()"></test>

지시문 속성 (예 : update-fn 함수)과 함수의 차이점을 알려주는 각도 방식입니다.


1
캐치 주셔서 감사합니다. 나는 그것을 내 대답에 포함시켰다. 투표했습니다! :)
AlwaysALearner 2016 년

10

양방향 바인딩으로 컨트롤러 기능을 전달하는 것은 어떻습니까? 그런 다음 일반 템플릿과 동일한 방식으로 지시문에서 사용할 수 있습니다 (간단 성을 위해 관련이없는 부분은 제거했습니다)

<div ng-controller="testCtrl">

   <!-- pass the function with no arguments -->
   <test color1="color1" update-fn="updateFn"></test>
</div>

<script>
   angular.module('dr', [])
   .controller("testCtrl", function($scope) {
      $scope.updateFn = function(msg) {
         alert(msg);
      }
   })
   .directive('test', function() {
      return {
         scope: {
            updateFn: '=' // '=' bidirectional binding
         },
         template: "<button ng-click='updateFn(1337)'>Click</button>"
      }
   });
</script>

위의 방법을 시도했기 때문에이 질문에 착륙했지만 어떻게 든 작동하지 않았습니다. 이제 완벽하게 작동합니다.


5

속성 이름에 대시와 소문자를 사용하십시오 (다른 답변이 말했듯이).

 <test color1="color1" update-fn="updateFn()"></test>

지시문 범위에서 "&"대신 "="를 사용하십시오.

 scope: { updateFn: '='}

그런 다음 다른 함수와 마찬가지로 updateFn을 사용할 수 있습니다.

 <button ng-click='updateFn()'>Click</button>

당신은 간다!


5
왜 '&'대신 '='을 사용 하시겠습니까? 이것을 시도했을 때 반복적으로 내 함수를 호출했습니다.
user1012500

2
이것을 위해 '='를 사용하는 것은 잘못입니다. 그것은 양방향 객체 바인딩을위한 것입니다.
벤 탈리아도 로스

1
유일한 문제는 첫 번째 템플릿에서 괄호를 사용하는 것입니다. 함수를 실행 한 다음 결과를 바인딩합니다. 대신 다음과 같이 함수 이름 만 전달해야합니다.update-fn="updateFn"
Márton Tamás

1
나쁜 대답입니다. 아주 나쁜.
5

4

작동하지 않기 때문에 "&"대신 "="바인딩을 사용해야했습니다. 이상한 행동.


2
이는 실행 대신 JS 함수 참조를 지시문에 전달할 가능성이 높기 때문입니다. 함수를 지시문의 인수로 전달할 때는 update-fn="updateFn()"괄호 (및 매개 변수)를 포함해야합니다. 함수 참조로 전달 update-fn="updateFn"하면 &바인딩에서 작동하지 않습니다.
JorgeGRC

0

@JorgeGRC 답변 주셔서 감사합니다. 그러나 "아마도"부분이 매우 중요합니다. 매개 변수가있는 경우 템플릿에도 매개 변수를 포함시키고 지역 을 지정해야합니다 ( 예 :) updateFn({msg: "Directive Args"}.

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