mis*_*eka 51 angularjs angularjs-scope
在我的一个Angular控制器中,我有这个:
// controller A
$rootScope.$on("myEventFire", function(event, reload) {
someAction();
});
Run Code Online (Sandbox Code Playgroud)
在另一个控制器中我有这个:
// controller B
$scope.openList = function(page) {
$rootScope.$broadcast('myEventFire', 1);
}
Run Code Online (Sandbox Code Playgroud)
现在,这是一个单页应用程序.当我最初转到控制器A并尝试触发此事件时,someAction()将被执行一次.如果我离开并再次回到控制器A并做同样的事情,someAction()会被执行两次.如果我再做一次,它会发生三次,依此类推.我在这做错了什么?
Jas*_*aat 95
你能尝试一下$scope.$on()吗?每次创建控制器A时,它都会在根作用域上添加一个新的侦听器,并且在您离开和返回时不会被销毁.如果在控制器的本地范围内执行此操作,则当您离开并且范围被破坏时,应该删除侦听器.
// controller A
$scope.$on("myEventFire", function(event, reload) {
someAction();
});
Run Code Online (Sandbox Code Playgroud)
$broadcast将事件向下发送到所有子范围,以便在本地范围内获取它. $emit另一种方式是向根范围冒泡.
jaf*_*af0 26
你也可以在销毁范围时通过运行$ rootScope.$ on()的返回回调来删除它.
即
var destroyFoo;
destroyFoo = $rootScope.$on('foo', function() {});
$scope.$on('$destroy', function() {
destroyFoo(); // remove listener.
});
Run Code Online (Sandbox Code Playgroud)
如果你不想破坏,
我想我们可以先检查一下监听器事件 - AngularJS 1.2.15
所以我认为这应该有效:
if(!$rootScope.$$listenerCount['myEventFire']){
$rootScope.$on("myEventFire", function(event, reload) {
someAction();
});
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
30230 次 |
| 最近记录: |