我想知道是否可以从另一个控制器调用一个控制器的功能。这种方式我试过但失败了:
<div ng-app="MyApp">
<div ng-controller="Ctrl1">
<button ng-click="func1()">func1</button>
</div>
<br>
<div ng-controller="Ctrl2">
<button ng-click="func2()">func2</button>
</div>
</div>
var app = angular.module('MyApp', []);
app.controller('Ctrl1', function($scope) {
$scope.func1 = function() {
alert('Ctrl1 and func1')
}
$scope.$on("MyFunction", function () {
alert('Ctrl1 MyFunction')
});
});
app.controller('Ctrl2', function($scope) {
$scope.func2 = function() {
alert('Ctrl2 and func2')
$scope.$emit("MyFunction");
}
});
当func2正在调用时,我使用$scope.$emit("MyFunction");
来调用Ctrl1 MyFunction
,但它不起作用。那不可能吗?
请在这里说清楚。
答案 0 :(得分:2)
当您想与兄弟控制器通信时,您必须使用rootScope
来捕获事件($ on)。使用这个
$rootScope.$on("MyFunction", function () {
alert('Ctrl1 MyFunction')
});
演示
var app = angular.module('MyApp', []);
app.controller('Ctrl1', function($scope,$rootScope) {
$scope.func1 = function() {
alert('Ctrl1 and func1')
}
$rootScope.$on("MyFunction", function () {
alert('Ctrl1 MyFunction')
});
});
app.controller('Ctrl2', function($scope) {
$scope.func2 = function() {
alert('Ctrl2 and func2')
$scope.$emit("MyFunction");
}
});
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="MyApp">
<div ng-controller="Ctrl1">
<button ng-click="func1()">func1</button>
</div>
<br>
<div ng-controller="Ctrl2">
<button ng-click="func2()">func2</button>
</div>
</div>
&#13;
答案 1 :(得分:2)
正如您向here询问使用服务的解决方案,这是一个示例。
我创建了2个使用单个服务(FirstCtrl
)的控制器(SecondCtrl
,Data
)。
请注意,函数alertName()
是在服务上定义的,每个控制器都可以使用它,因为每个控制器中的服务都是injected。
var myApp = angular.module('myApp', []);
myApp.service('Data', function() {
var name = 'Mistalis';
return {
alertName: function() {
alert(name);
}
};
});
myApp.controller('FirstCtrl', function($scope, Data) {
$scope.showName = function() {
Data.alertName();
}
});
myApp.controller('SecondCtrl', function($scope, Data) {
$scope.showName = function() {
Data.alertName();
}
});
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="myApp">
<div ng-controller="FirstCtrl">
Controller 1<br/>
<button ng-click="showName()">Show name from service</button>
</div>
<hr>
<div ng-controller="SecondCtrl">
Controller 2<br/>
<button ng-click="showName()">Show name from service</button>
</div>
</div>
&#13;
答案 2 :(得分:2)
使用$rootScope.$broadcast
:
app.controller('Ctrl1', function($scope) {
$scope.func1 = function() {
alert('Ctrl1 and func1')
}
$scope.$on("MyFunction", function () {
alert('Ctrl1 MyFunction')
});
});
app.controller('Ctrl2', function($scope, $rootScope) {
$scope.func2 = function() {
alert('Ctrl2 and func2')
//$scope.$emit("MyFunction");
//USE rootScope
$rootScope.$broadcast("MyFunction");
}
});
最佳做法:为避免内存泄漏,请避免在$on
上使用$rootScope
侦听器。移除控制器后,$scope
上的监听器将被自动正确销毁。
有关AngularJS事件总线的更多信息,请参阅