我在控制器中定义了一个函数,我想在另一个控制器中调用它。
我试图将它附加到$rootscope
所以我可以在另一个控制器中看到,但我不能。
有没有办法调用它,而不将其附加到$rootscope
?
答案 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
强>