2014-02-18 2 views
0

큰 컨트롤러를 분할하려고합니다. 가는 방법은 공장을 통하는 것이지만, DOM을 바꾸고 있기 때문에 컨트롤러를 통해해야합니다.Angularjs 다른 컨트롤러에서 컨트롤러의 기능을 호출하는 방법

그런 다음 Cntrl1에서 Cntrl2에 정의 된 함수를 호출하려고합니다. 예

HTML

<body ng-app="app"> 
<div ng-controller='Cntrl1'> 
{{message}} 
</div> 
</body> 

JS

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

angular.module('app').controller('Cntrl1', 
['$scope', '$q', '$timeout', 'Share_scope', 
function ($scope, $q, $timeout, Share_scope) { 
    Share_scope.process(); 
    $scope.message = 'started'; 
}]); 

angular.module('app').controller('Cntrl2', 
['$scope', '$q', '$timeout', 'Share_scope', 
function ($scope, $q, $timeout, Share_scope) { 
    Share_scope.x = function() { 
      alert('done'); 
    } 
}]); 

angular.module('app').factory('Share_scope', 
['$window', '$q', 
function($window, $q) { 
    var x; 
    return { 
     process: function() { 
      return x; 
     }, 
    }; 
}]); 

http://jsfiddle.net/T8rgv/7/

는 내가 기대하는 것은 Cntrl2의 기능으로 공장의 "var에 x"를 정의하는 것입니다 데모, 다음 Cntrl1에서 호출 할 때 공장 통해이 함수를 실행하십시오.

그럼 어떻게 만드나요? 이 접근법이 맞습니까? 아니면 그냥 공장에서 DOM을 변경해야합니까?

건배, 제라드

+0

"share_scope"라는 공장의 이름을 잘못 지정했다고 생각합니다. 공장이 범위가 아닙니다. 그러나 컨트롤러를 사용하는 좋은 방법은 공장을 통하는 것입니다. – koolunix

답변

1

는 관련 Cntrl2이 Cntrl1에이고, 나는 방출 또는 약간 같이 방송을 사용하는 것이 알면서. 과거의 경험에 비추어 볼 때, 같은 페이지에서 둘 이상의 다른 모듈을 사용하는 것은 좋은 생각이라고 생각하지 않습니다.

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

angular.module('app').controller('Cntrl1', 
['$scope', '$q', '$timeout', 'myFactory', 
function ($scope, $q, $timeout, myFactory) { 
    $scope.$emit('messageEvt','started'); 
    myFactory.process().then(function() { 
     $scope.$emit('messageEvt','ended'); 
    }); 
}]); 

angular.module('app').controller('Cntrl2', 
['$scope', '$q', '$timeout', $rootScope, 
function ($scope, $q, $timeout, $rootScope) { 
    $rootScope.$on('messageEvt',function(e,msg) { 
     $scope.message = msg; 
    } 
}]); 

angular.module('app').factory('myFactory', 
['$window', '$q','$timeout', 
function($window, $q,$timeout) { 
    var x; 
    return { 
     process: function() { 
      var deferObj = $q.defer(); 
      $timeout(function() { 
       deferObj.resolve(x); 
      }); 
      return deferObj.promise; 
     }, 
    }; 
}]); 
+0

팩토리에서 html 코드를 생성하는 것이 정상임을 깨달았습니다. 단지 공장에서가 아니라 컨트롤러의 DOM에 코드를 삽입해야한다는 것입니다. 이것이 맞다면, 단일 컨트롤러를 사용하여 DOM과 공장을 조작하여 나중에 추가해야하는 hmtl을 구성하게 될 것입니다. 그런 다음 질문이 부적합합니다. – Gerard

0

나는이 작업을 수행하는 더 좋은 방법은 공장 모델 필요할 때를 업데이트하는 두 컨트롤러를 유지함으로써라고 생각합니다.

은 내가 잘못을 이해 있으면 알려 주시기 바랍니다 http://jsfiddle.net/hh5Cy/2/

angular.module('app').factory('Share_scope', 
['$window', '$q', 
function($window, $q) { 
    var x; 

    return { 
     getProcess: function() { 
      return x; 
     }, 
     setProcess: function(value){ 
      x = value; 
     } 
    }; 
}]); 

에 바이올린을 업데이트했습니다.

관련 문제