在不同的控制器中调用范围功能

时间:2014-12-28 15:40:25

标签: angularjs angularjs-scope

我在控制器中定义了一个函数,我想在另一个控制器中调用它。 我试图将它附加到$rootscope所以我可以在另一个控制器中看到,但我不能。 有没有办法调用它,而不将其附加到$rootscope

3 个答案:

答案 0 :(得分:1)

据我所知,在AngularJS中,您可以通过3种方式在控制器之间共享信息:
1 - 创建服务。
2 - 创建链接到$ rootScope的函数 3 - 使用事件($ broadcast和$ on)。我在我的项目中使用了很多这种方法。

我认为你的问题是你没有实例化控制器 正确的顺序或其中一个从未实例化,因此 您要链接到该控制器中的$ rootScope或广播事件永远不会触发的函数。

E.G如果你想在2控制器中调用链接到$ rootScope的函数 第一个,这是不可能的,因为2控制器在第一个之后被实例化 在应用程序运行时调用时会发生这种情况。

我将通过一些更改来实施您的方法:

HTML:

 <div ng-controller="MyCtrl_1"></div>
 <div ng-controller="MyCtrl_2">
     <button ng-click="send()">Send Mess</button>
 </div>

JS:

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

function MyCtrl_1($scope, $rootScope) { 

   $scope.$on('RenderPage', function (event, PageId) { 
      $scope.RenderPage = PageId;
      alert($scope.RenderPage);
   });

};


function MyCtrl_2($scope, $rootScope) {

   $scope.MasterPageId = 10;
   $scope.send = function(){
      $rootScope.$broadcast('RenderPage', $scope.MasterPageId);
   }

};


小心使用$ broadcast和$ emit,因为每个都有不同的行为。

在此尝试:http://jsfiddle.net/1ypkb4s9/
否则,发布您的错误。

答案 1 :(得分:0)

如果要在两个或更多控制器中使用相同的功能,则可能需要服务。

或使用活动

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

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

答案 2 :(得分:0)

只需用“父亲控制器”包裹它们:

HTML:

<div ng-app="myApp" ng-controller="myOuterCtrl">
    <div ng-controller="myInnerCtrl1">
        <button ng-click="outerClick()">Outer Click</button>
    </div>
    <div ng-controller="myInnerCtrl2">
        <button ng-click="innerTwoClick()">Inner Click</button>
    </div>
</div>

JS:

angular.module('myApp', []).
controller('myOuterCtrl', function ($scope) {
    $scope.outerClick = function () {
        console.log('outer click');
    }
}).
controller('myInnerCtrl1', function ($scope) {
    // nothing here!!
}).
controller('myInnerCtrl2', function ($scope) {
    $scope.innerTwoClick = function () {
        console.log('inner two click');
    }
});

<强> JSFIDDLE