한 AngularJS 컨트롤러가 다른 AngularJS 컨트롤러를 호출 할 수 있습니까?


581

한 컨트롤러가 다른 컨트롤러를 사용할 수 있습니까?

예를 들면 다음과 같습니다.

이 HTML 문서는 단순히 MessageCtrl컨트롤러가 messageCtrl.js파일로 전달한 메시지를 인쇄 합니다.

<html xmlns:ng="http://angularjs.org/">
<head>
    <meta charset="utf-8" />
    <title>Inter Controller Communication</title>
</head>
<body>
    <div ng:controller="MessageCtrl">
        <p>{{message}}</p>
    </div>

    <!-- Angular Scripts -->
    <script src="http://code.angularjs.org/angular-0.9.19.js" ng:autobind></script>
    <script src="js/messageCtrl.js" type="text/javascript"></script>
</body>
</html>

컨트롤러 파일에는 다음 코드가 포함되어 있습니다.

function MessageCtrl()
{
    this.message = function() { 
        return "The current date is: " + new Date().toString(); 
    };
}

단순히 현재 날짜를 인쇄합니다.

DateCtrl특정 형식의 날짜를 다시 제출 한 다른 컨트롤러를 추가 하려면 MessageCtrl어떻게해야합니까? DI 프레임 워크는 XmlHttpRequests서비스에 액세스하고 액세스 하는 것으로 보입니다 .


4
이 Google 그룹 스레드 인 groups.google.com/d/topic/angular/m_mn-8gnNt4/discussion 은 컨트롤러가 서로 대화 할 수있는 5 가지 방법에 대해 설명합니다.
마크 Rajcok

여기에 좋은 대답이 이미 있으므로 언급 한 특정 사용 사례에 대해 AngularJS 필터가 더 나은 솔루션 일 수 있음을 지적하고 싶습니다. 방금 언급하겠다고 생각했습니다 :)
Joe Dyndale

답변:


705

컨트롤러 간 통신 방법에는 여러 가지가 있습니다.

가장 좋은 것은 아마도 서비스를 공유하는 것입니다.

function FirstController(someDataService) 
{
  // use the data service, bind to template...
  // or call methods on someDataService to send a request to server
}

function SecondController(someDataService) 
{
  // has a reference to the same instance of the service
  // so if the service updates state for example, this controller knows about it
}

다른 방법은 범위에서 이벤트를 내보내는 것입니다.

function FirstController($scope) 
{
  $scope.$on('someEvent', function(event, args) {});
  // another controller or even directive
}

function SecondController($scope) 
{
  $scope.$emit('someEvent', args);
}

두 경우 모두 지시어와도 통신 할 수 있습니다.


4
Hia, 첫 번째 예에서는 웹 페이지가 스택의 모든 서비스를 인식해야합니다. 어떤 냄새가 나지 않습니까 (?). 두 번째와 마찬가지로 웹 페이지에서 $ scope 인수를 제공하지 않아도됩니까?
BanksySan

54
뭐? 왜? 모든 컨트롤러는 Angular의 DI에 의해 주입됩니다.
Vojta

7
@JoshNoe in 1 / 두 개의 컨트롤러 (또는 그 이상)가 있으며 둘 다 동일한 / 공유 서비스를 얻습니다. 그런 다음 의사 소통하는 방법에는 여러 가지가 있으며 그중 일부는 언급했습니다. 특정 사용 사례에 따라 결정합니다. 공유 논리 / 상태를 서비스에 넣고 두 컨트롤러 모두 해당 서비스에 위임하거나 서비스를 템플리트로 내보낼 수도 있습니다. 물론,이 서비스는 이벤트를
시작할

137
늦게 와서 : AngularJS에서 일하는 Google의 Vojta와 논쟁하고 있다는 것을 알고 있습니까? :)
Suman

16
HTML에서 이벤트 발생 컨트롤러가 작동하려면 청취 컨트롤러의 자식 노드 여야한다는 것이 분명하지 않았습니다.
djangonaut

122

이 바이올린을보십시오 : http://jsfiddle.net/simpulton/XqDxG/

다음 비디오도 시청하십시오. 컨트롤러 간 통신

HTML :

<div ng-controller="ControllerZero">
  <input ng-model="message" >
  <button ng-click="handleClick(message);">LOG</button>
</div>

<div ng-controller="ControllerOne">
  <input ng-model="message" >
</div>

<div ng-controller="ControllerTwo">
  <input ng-model="message" >
</div>

자바 스크립트 :

var myModule = angular.module('myModule', []);
myModule.factory('mySharedService', function($rootScope) {
  var sharedService = {};

  sharedService.message = '';

  sharedService.prepForBroadcast = function(msg) {
    this.message = msg;
    this.broadcastItem();
  };

  sharedService.broadcastItem = function() {
    $rootScope.$broadcast('handleBroadcast');
  };

  return sharedService;
});

function ControllerZero($scope, sharedService) {
  $scope.handleClick = function(msg) {
    sharedService.prepForBroadcast(msg);
  };

  $scope.$on('handleBroadcast', function() {
    $scope.message = sharedService.message;
  });        
}

function ControllerOne($scope, sharedService) {
  $scope.$on('handleBroadcast', function() {
    $scope.message = 'ONE: ' + sharedService.message;
  });        
}

function ControllerTwo($scope, sharedService) {
  $scope.$on('handleBroadcast', function() {
    $scope.message = 'TWO: ' + sharedService.message;
  });
}

ControllerZero.$inject = ['$scope', 'mySharedService'];        

ControllerOne.$inject = ['$scope', 'mySharedService'];

ControllerTwo.$inject = ['$scope', 'mySharedService'];

12
위의 바이올린과 비디오는 서비스를 공유합니다. 다음은 $ scope. $ emit를 사용하는 바이올린입니다. jsfiddle.net/VxafF
Mark Rajcok

1
@ adardesign : 지시어에 대한 간결하고 의미있는 예제를 읽는 것을 좋아합니다 (이 답변에 감사드립니다!)
sscarduzio

훌륭한 답변, myModule.factory 대신 myModule.service ( 'mySharedService', function ($ rootScope) {})를 사용하지만 그다지 작동하지 않습니다!
TacoEater

우수한. 그럼에도 불구하고 질문이 있습니다. ControllerZero 내에 핸들러를 추가 한 이유는 무엇입니까? $ scope. $ on ( 'handleBroadcast', function () {$ scope.message = sharedService.message;});
ZooZ

제공된 비디오는 정말 굉장합니다! 이것이 다른 컨트롤러에서 다른 컨트롤러의 상태를 문의하는 데 필요한 것 같습니다. 그러나 "invoke"기능을 사용하면 작동하지 않습니다. "트리거"동작을 사용하여 작동합니다. 따라서 효과적으로 컨트롤러가 작업을 수행하고 새로운 상태를 가지면 상태를 브로드 캐스트해야하며 해당 브로드 캐스트를 듣고 이에 따라 응답하는 것은 다른 컨트롤러의 책임입니다. 또는 공유 서비스에서 작업을 수행 한 다음 상태를 브로드 캐스트하십시오. 내 이해가 올바른지 알려주세요.
tarekahf

53

하나의 컨트롤러를 다른 컨트롤러로 호출하려면 사용할 수있는 네 가지 방법이 있습니다

  1. $ rootScope. $ emit () 및 $ rootScope. $ broadcast ()
  2. 보조 컨트롤러가 자식 인 경우 부모 자식 통신을 사용할 수 있습니다.
  3. 서비스 이용
  4. 해킹의 종류-angular.element ()의 도움으로

1. $ rootScope. $ emit () 및 $ rootScope. $ broadcast ()

컨트롤러와 해당 범위는 손상 될 수 있지만 $ rootScope는 애플리케이션 전체에 남아 있으므로 $ rootScope는 모든 범위의 상위이므로 $ rootScope를 사용합니다.

부모와 자녀 사이에 의사 소통을하고 있고 심지어 자녀가 형제와 의사 소통하기를 원한다면 $ broadcast를 사용할 수 있습니다

자식에서 부모로의 통신을 수행하는 경우 형제가 없습니다. $ rootScope를 사용할 수 있습니다.

HTML

<body ng-app="myApp">
    <div ng-controller="ParentCtrl" class="ng-scope">
      // ParentCtrl
      <div ng-controller="Sibling1" class="ng-scope">
        // Sibling first controller
      </div>
      <div ng-controller="Sibling2" class="ng-scope">
        // Sibling Second controller
        <div ng-controller="Child" class="ng-scope">
          // Child controller
        </div>
      </div>
    </div>
</body>

Angularjs 코드

 var app =  angular.module('myApp',[]);//We will use it throughout the example 
    app.controller('Child', function($rootScope) {
      $rootScope.$emit('childEmit', 'Child calling parent');
      $rootScope.$broadcast('siblingAndParent');
    });

app.controller('Sibling1', function($rootScope) {
  $rootScope.$on('childEmit', function(event, data) {
    console.log(data + ' Inside Sibling one');
  });
  $rootScope.$on('siblingAndParent', function(event, data) {
    console.log('broadcast from child in parent');
  });
});

app.controller('Sibling2', function($rootScope) {
  $rootScope.$on('childEmit', function(event, data) {
    console.log(data + ' Inside Sibling two');
  });
  $rootScope.$on('siblingAndParent', function(event, data) {
    console.log('broadcast from child in parent');
  });
});

app.controller('ParentCtrl', function($rootScope) {
  $rootScope.$on('childEmit', function(event, data) {
    console.log(data + ' Inside parent controller');
  });
  $rootScope.$on('siblingAndParent', function(event, data) {
    console.log('broadcast from child in parent');
  });
});

위의 $ emit 'childEmit'코드 콘솔에서는 자식 형제 내부를 호출하지 않으며 부모 내부에서만 호출합니다. 여기서 부모는 $ broadcast가 형제 및 부모 내부에서도 호출됩니다. 이것은 성능이 작동하는 곳입니다. 더티 검사를 건너 뛰기 때문에 자녀 간 통신을 사용하는 경우 선호됩니다.

2. 보조 컨트롤러가 하위 인 경우 하위 부모 커뮤니케이션을 사용할 수 있습니다

가장 좋은 방법 중 하나입니다 . 자녀가 직계 부모 와 의사 소통하기를 원하는 자녀 부모 의사 소통을 원한다면 어떤 종류의 $ broadcast 또는 $ emit이 필요하지 않지만 부모와 자녀 사이의 의사 소통을 원한다면 service 또는 $ broadcast를 사용하십시오

예를 들어 HTML :-

<div ng-controller="ParentCtrl">
 <div ng-controller="ChildCtrl">
 </div>
</div>

Angularjs

 app.controller('ParentCtrl', function($scope) {
   $scope.value='Its parent';
      });
  app.controller('ChildCtrl', function($scope) {
   console.log($scope.value);
  });

Child to Parent 통신을 사용할 때마다 Angularjs는 Child 내부의 변수를 검색합니다. 내부에 존재하지 않으면 상위 컨트롤러 내부의 값을 보도록 선택합니다.

3. 서비스 이용

AngularJS는 서비스 아키텍처를 사용하여 "문제의 분리" 개념을 지원합니다 . 서비스는 자바 스크립트 기능이며 특정 작업 만 수행 할 책임이 있습니다. 따라서 서비스는 유지 관리 및 테스트가 가능한 개별 엔티티 가 됩니다. Angularjs의 Dependency Injection mecahnism을 사용하여 주입하는 데 사용되는 서비스입니다.

Angularjs 코드 :

app.service('communicate',function(){
  this.communicateValue='Hello';
});

app.controller('ParentCtrl',function(communicate){//Dependency Injection
  console.log(communicate.communicateValue+" Parent World");
});

app.controller('ChildCtrl',function(communicate){//Dependency Injection
  console.log(communicate.communicateValue+" Child World");
});

출력 Hello Child World 및 Hello Parent World가 출력됩니다. Angular 서비스 문서에 따르면 Singletons – 서비스에 종속 된 각 구성 요소는 서비스 팩토리에서 생성 된 단일 인스턴스에 대한 참조를 가져옵니다 .

해킹의 종류-angular.element ()의 도움으로

이 메소드는 Id / unique class.angular.element () 메소드로 요소에서 scope ()를 가져옵니다. element를 리턴하고 scope ()는 한 컨트롤러의 $ scope 변수를 사용하여 다른 변수의 $ scope 변수를 제공합니다.

HTML :-

<div id='parent' ng-controller='ParentCtrl'>{{varParent}}
 <span ng-click='getValueFromChild()'>Click to get ValueFormChild</span>
 <div id='child' ng-controller='childCtrl'>{{varChild}}
   <span ng-click='getValueFromParent()'>Click to get ValueFormParent </span>
 </div>
</div>

Angularjs :-

app.controller('ParentCtrl',function($scope){
 $scope.varParent="Hello Parent";
  $scope.getValueFromChild=function(){
  var childScope=angular.element('#child').scope();
  console.log(childScope.varChild);
  }
});

app.controller('ChildCtrl',function($scope){
 $scope.varChild="Hello Child";
  $scope.getValueFromParent=function(){
  var parentScope=angular.element('#parent').scope();
  console.log(parentScope.varParent);
  }
}); 

위의 코드에서 컨트롤러는 Html에 자체 값을 표시하고 텍스트를 클릭하면 콘솔에 따라 값이 표시됩니다. 부모 컨트롤러 범위를 클릭하면 브라우저가 자식의 콘솔 값을 가져오고 그 반대도 마찬가지입니다.


52

다음은 서비스 데이터를 공유하는 두 컨트롤러의 한 페이지 예입니다.

<!doctype html>
<html ng-app="project">
<head>
    <title>Angular: Service example</title>
    <script src="http://code.angularjs.org/angular-1.0.1.js"></script>
    <script>
var projectModule = angular.module('project',[]);

projectModule.factory('theService', function() {  
    return {
        thing : {
            x : 100
        }
    };
});

function FirstCtrl($scope, theService) {
    $scope.thing = theService.thing;
    $scope.name = "First Controller";
}

function SecondCtrl($scope, theService) {   
    $scope.someThing = theService.thing; 
    $scope.name = "Second Controller!";
}
    </script>
</head>
<body>  
    <div ng-controller="FirstCtrl">
        <h2>{{name}}</h2>
        <input ng-model="thing.x"/>         
    </div>

    <div ng-controller="SecondCtrl">
        <h2>{{name}}</h2>
        <input ng-model="someThing.x"/>             
    </div>
</body>
</html>

또한 여기에 : https://gist.github.com/3595424


그리고 theServiceupdates thing.x이면 해당 변경 내용이 <input> s FirstCtrl및 <input>에 자동으로 파급됩니다 SecondCtrl. 또한 thing.x두 개의 <입력>을 통해 직접 변경할 수도 있습니다 (오른쪽?).
KajMagnus

4
예. 모든 Angular 서비스는 응용 프로그램 싱글 톤이므로 서비스 인스턴스가 하나만 있습니다. 참조 : docs.angularjs.org/guide/dev_guide.services.creating_services
exclsr

내 이전 의견의 링크는 404이므로 오늘 서비스 안내서는 다음과 같습니다. 서비스는 싱글 톤입니다. docs.angularjs.org/guide/services
exclsr

1
@exclsr 예! 미안 내가 전에 그것을 그리워
CodyBugstein

3
지금까지 웹에서 본 최고의 예입니다. 감사합니다
Sevenearths

33

컨트롤러간에 데이터를 공유하거나 기능을 호출하기 위해 이벤트를 내보내고 브로드 캐스트하려는 경우이 링크 를보고 답변을 확인하십시오 zbynour(최대 투표 수). 나는 그의 대답을 인용하고 있습니다 !!!

firstCtrl의 범위가 secondCtrl 범위의 부모 인 경우 코드는 firstCtrl에서 $ emit을 $ broadcast로 대체하여 작동합니다.

function firstCtrl($scope){
    $scope.$broadcast('someEvent', [1,2,3]);
}

function secondCtrl($scope){
    $scope.$on('someEvent', function(event, mass) {console.log(mass)});
}

스코프간에 상위-하위 관계가없는 경우 $ rootScope를 컨트롤러에 주입하고 모든 하위 범위 (예 : secondCtrl)로 이벤트를 브로드 캐스트 할 수 있습니다.

function firstCtrl($rootScope){
    $rootScope.$broadcast('someEvent', [1,2,3]);
}

마지막으로 자식 컨트롤러에서 범위를 넘어서 이벤트를 전달해야 할 경우 $ scope. $ emit을 사용할 수 있습니다. firstCtrl의 범위가 secondCtrl 범위의 상위 인 경우 :

function firstCtrl($scope){
    $scope.$on('someEvent', function(event, data) { console.log(data); });
}

function secondCtrl($scope){
    $scope.$emit('someEvent', [1,2,3]);
}

24

바이올린 두 개 더 : (비 서비스 방식)

1) $scope부모 -자식 컨트롤러의 경우- 부모 컨트롤러를 사용하여 이벤트를 발생 / 방송합니다. http://jsfiddle.net/laan_sachin/jnj6y/

2) $rootScope관련이없는 컨트롤러에서 사용. http://jsfiddle.net/VxafF/


이벤트와 관련된이 모든 복잡한 이유는 무엇입니까? 왜 이런 짓을하지 않습니까? jsfiddle.net/jnj6y/32
Dfr

그것은 어떤 종류의 부모 자녀 관계에 달려 있습니다. DOM 계층 구조 일 수 있습니다.이 경우 이벤트로 인해 항목을 분리 할 수 ​​있습니다.
DarkKnight

17

이벤트가 스코프 계층 구조를 위아래로 버블 링하여 복잡한 응용 프로그램의 성능 병목 상태로 쉽게 저하 될 수 있으므로 실제로 이미 터 및 브로드 캐스트를 사용하는 것은 비효율적입니다.

서비스를 사용하는 것이 좋습니다. - 저는 여기에 최근에 내 프로젝트 중 하나에 구현하는 방법이다 https://gist.github.com/3384419 .

기본 아이디어-펍 서브 / 이벤트 버스를 서비스로 등록하십시오. 그런 다음 이벤트 / 주제를 구독하거나 게시해야 할 경우 해당 이벤트 버스를 주입하십시오.


5

나도 이런 식으로 알고 있습니다.

angular.element($('#__userProfile')).scope().close();

그러나 각도 코드에서 jQuery 선택기를 사용하지 않기 때문에 너무 많이 사용하지 않습니다.


가장 좋은 답변입니다. 간단하고 쉬운 ... =)
zVictor

3
@zVictor, 이것은 실제로 "마지막 수단"유형의 접근 방식입니다. 작동하지만 강제로 다시 들어가기 위해 범위를 벗어납니다. 이것은 프로그래밍 방식으로 수행하는 대신 DOM 조작을 사용하여 무언가를 수행하도록합니다. 간단하지만 작동하지만 확장 할 수는 없습니다.
Brian Noah

2
@BrianNoah, 사실입니다. 프로토 타입 또는 일부 실험에는이 코드를 사용해도되지만 프로덕션 코드에는 사용하지 않아도됩니다.
Andrey Korchak

1
그것은 최악의 일입니다. 서비스의 DOM 조작 및 직접 범위 액세스
Mattia Franchetto

3

이 방법은 서비스에 의존하지 않는다, $broadcast또는 $emit. 모든 경우에 적합하지는 않지만 지시문으로 추상화 할 수있는 2 개의 관련 컨트롤러가있는 경우require 있는 경우 지시문 정의에서 옵션을 . 이것은 ngModel과 ngForm이 통신하는 방식 일 가능성이 높습니다. 이를 사용하여 중첩되거나 동일한 요소에있는 지시문 컨트롤러간에 통신 할 수 있습니다.

부모 / 자녀 상황의 경우 다음과 같이 사용됩니다.

<div parent-directive>
  <div inner-directive></div>
</div>

그리고 그것을 작동시키는 주요 요점 : 부모 지시문에서 호출 할 메소드와 함께 on on이 this아닌 on을 정의해야합니다 $scope.

controller: function($scope) {
  this.publicMethodOnParentDirective = function() {
    // Do something
  }
}

하위 지시문 정의에서 require옵션을 사용하여 상위 제어기가 링크 함수에 전달되도록 할 수 있습니다 scope. 따라서 하위 지시문 에서 함수를 호출 할 수 있습니다 .

require: '^parentDirective',
template: '<span ng-click="onClick()">Click on this to call parent directive</span>',
link: function link(scope, iElement, iAttrs, parentController) {
  scope.onClick = function() {
    parentController.publicMethodOnParentDirective();
  }
}

위의 내용은 http://plnkr.co/edit/poeq460VmQER8Gl9w8Oz?p=preview 에서 볼 수 있습니다 .

형제 지시문도 비슷하게 사용되지만 동일한 요소에 대한 두 지시문은 다음과 같습니다.

<div directive1 directive2>
</div>

에 메소드를 작성하여 사용합니다 directive1.

controller: function($scope) {
  this.publicMethod = function() {
    // Do something
  }
}

그리고 지시문 2 require에서 siblingController가 링크 함수로 전달되는 옵션을 사용하여 호출 할 수 있습니다 .

require: 'directive1',
template: '<span ng-click="onClick()">Click on this to call sibling directive1</span>',
link: function link(scope, iElement, iAttrs, siblingController) {
  scope.onClick = function() {
    siblingController.publicMethod();
  }
}

이것은 http://plnkr.co/edit/MUD2snf9zvadfnDXq85w?p=preview 에서 볼 수 있습니다 .

이것의 사용?

  • 부모 : 자식 요소가 부모에게 자신을 "등록"해야하는 모든 경우. ngModel과 ngForm의 관계와 매우 유사합니다. 이것들은 모델에 영향을 줄 수있는 특정 행동을 추가 할 수 있습니다. 부모 요소가 특정 자식의 위치를 ​​관리 해야하는 곳, 즉 스크롤을 관리하거나 반응 해야하는 순수한 DOM을 기반으로 할 수도 있습니다.

  • 형제 : 지시문이 동작을 수정하도록 허용합니다. ngModel은 입력에서 ngModel 사용에 파서 / 유효성을 추가하는 전형적인 경우입니다.


3

이것이 표준이 아닌지 모르겠지만 모든 컨트롤러가 동일한 파일에 있으면 다음과 같이 할 수 있습니다.

app = angular.module('dashboardBuzzAdmin', ['ngResource', 'ui.bootstrap']);

var indicatorsCtrl;
var perdiosCtrl;
var finesCtrl;

app.controller('IndicatorsCtrl', ['$scope', '$http', function ($scope, $http) {
  indicatorsCtrl = this;
  this.updateCharts = function () {
    finesCtrl.updateChart();
    periodsCtrl.updateChart();
  };
}]);

app.controller('periodsCtrl', ['$scope', '$http', function ($scope, $http) {
  periodsCtrl = this;
  this.updateChart = function() {...}
}]);

app.controller('FinesCtrl', ['$scope', '$http', function ($scope, $http) {
  finesCtrl = this;
  this.updateChart = function() {...}
}]);

보시다시피 indicatorsCtrl은 updateCharts를 호출 할 때 다른 두 컨트롤러의 updateChart 기능을 호출합니다.


2

부모 컨트롤러 (MessageCtrl)에 '$ controller'서비스를 주입 한 다음 다음을 사용하여 자식 컨트롤러 (DateCtrl)를 인스턴스화 / 주입 할 수 있습니다.
$scope.childController = $controller('childController', { $scope: $scope.$new() });

이제 서비스이므로 메소드를 호출하여 하위 컨트롤러의 데이터에 액세스 할 수 있습니다.
문제가 있으면 알려주세요.


1

다음은 publish-subscribeAngular JS에 관계없이 접근 방식입니다.

검색 매개 변수 컨트롤러

//Note: Multiple entities publish the same event
regionButtonClicked: function () 
{
        EM.fireEvent('onSearchParamSelectedEvent', 'region');
},

plantButtonClicked: function () 
{
        EM.fireEvent('onSearchParamSelectedEvent', 'plant');
},

검색 선택 컨트롤러

//Note: It subscribes for the 'onSearchParamSelectedEvent' published by the Search Param Controller
localSubscribe: function () {
        EM.on('onSearchParamSelectedEvent', this.loadChoicesView, this);

});


loadChoicesView: function (e) {

        //Get the entity name from eData attribute which was set in the event manager
        var entity = $(e.target).attr('eData');

        console.log(entity);

        currentSelectedEntity = entity;
        if (entity == 'region') {
            $('.getvalue').hide();
            this.loadRegionsView();
            this.collapseEntities();
        }
        else if (entity == 'plant') {
            $('.getvalue').hide();
            this.loadPlantsView();
            this.collapseEntities();
        }


});

이벤트 관리자

myBase.EventManager = {

    eventArray:new Array(),


    on: function(event, handler, exchangeId) {
        var idArray;
        if (this.eventArray[event] == null) {
            idArray = new Array();
        } else { 
            idArray = this.eventArray[event];
        }
        idArray.push(exchangeId);
        this.eventArray[event] = idArray;

        //Binding using jQuery
        $(exchangeId).bind(event, handler);
    },

    un: function(event, handler, exchangeId) {

        if (this.eventArray[event] != null) {
            var idArray = this.eventArray[event];
            idArray.pop(exchangeId);
            this.eventArray[event] = idArray;

            $(exchangeId).unbind(event, handler);
        }
    },

    fireEvent: function(event, info) {
        var ids = this.eventArray[event];

        for (idindex = 0; idindex < ids.length; idindex++) {
            if (ids[idindex]) {

                //Add attribute eData
                $(ids[idindex]).attr('eData', info);
                $(ids[idindex]).trigger(event);
            }
        }
    }
};

글로벌

var EM = myBase.EventManager;

1

각도 1.5에서는 다음을 수행하여 수행 할 수 있습니다.

(function() {
  'use strict';

  angular
    .module('app')
    .component('parentComponent',{
      bindings: {},
      templateUrl: '/templates/products/product.html',
      controller: 'ProductCtrl as vm'
    });

  angular
    .module('app')
    .controller('ProductCtrl', ProductCtrl);

  function ProductCtrl() {
    var vm = this;
    vm.openAccordion = false;

    // Capture stuff from each of the product forms
    vm.productForms = [{}];

    vm.addNewForm = function() {
      vm.productForms.push({});
    }
  }

}());

이것은 부모 구성 요소입니다. 이것으로 다른 객체를 내 productForms배열 로 푸시하는 함수를 만들었습니다. 참고-이것은 단지 예입니다.이 함수는 실제로 무엇이든 될 수 있습니다.

이제 우리는 사용할 다른 컴포넌트를 만들 수 있습니다 require:

(function() {
  'use strict';

  angular
    .module('app')
    .component('childComponent', {
      bindings: {},
      require: {
        parent: '^parentComponent'
      },
      templateUrl: '/templates/products/product-form.html',
      controller: 'ProductFormCtrl as vm'
    });

  angular
    .module('app')
    .controller('ProductFormCtrl', ProductFormCtrl);

  function ProductFormCtrl() {
    var vm = this;

    // Initialization - make use of the parent controllers function
    vm.$onInit = function() {
      vm.addNewForm = vm.parent.addNewForm;
    };  
  }

}());

여기에서 자식 구성 요소는 부모 구성 요소 함수에 대한 참조를 만들고 addNewFormHTML에 바인딩되어 다른 함수처럼 호출 될 수 있습니다.

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