angularJS无论作为开发SPA(Single Page Application)的工具还是作为开发Hybrid App的武器,都体现了很好的开发效率,
但其中很多复杂的机制,在不同的业务场景下,有时却表现出不同的结果
以广播通信机制为例,有些项目工程中会表现出,从A controller跳转到 B controller,再跳转到 C controller,在C中发出广播(标准的$scope.$emit()),B中接收广播($rootScope.$on()),如果我们在B controller接收广播的代码中,写好打印语句,此时会打印一次
那么当我们从B controller返回A controller,再进入B controller再进入C controller,发送广播,B中接收广播,打印语句会连续执行2次
重复执行上面的步骤,每次回到A controller再重新进入这个广播发送与接收的模块,**广播都会比之前多执行一次
如果项目开发中,我们遇到这种问题的话,从某种角度上讲,我们的广播机制基本上算报废了,因为重复的广播接收必然导致性能下降
翻看angularJS的源码,其实广播通信机制是可以在controller $destroy时进行销毁的。
代码如下:
app.controller("CCtrl", [ '$scope',‘$ionicHistory’, function($scope,$ionicHistory){ $scope.back = function(){ $scope.$emit("Hello");//C controller中发送广播 }; }]); app.controller("BCtrl", [ '$scope','$rootScope', function($scope,$rootScope){ var destroyHello=$rootScope.$on("Hello",function(){//接收广播 conole.log('Hello'); }); $scope.$on('$destroy',function(){//controller回收资源时执行 destroyHello();//回收广播 }); }]);
广播的回调函数就是销毁这个广播的关键,我们在回收controller资源时,将我们的接收广播部门的代码回收掉,保证下次重新进入这个模块时,不会重复接收C controller中发送出的通信广播