今天在開發時,遇到一個坑,花了一下午時間也沒找到原因,無奈小菜鳥只能尋求公司里大牛的幫助,果然,大牛就是大牛,對比了幾個輸出結果,就看出問題所在。所以小菜鳥當然不會錯過這個分享的時機啦~廢話不多說進入正題:
在angular開發時,會把整體分解成各個功能塊,然后使用自定義指令directive或者service或者factory,總之想盡辦法再給組合在一起,所以問題來了~
比如:往一個頁面添加元素(按鈕?等等),此時點擊添加的按鈕在directive1里,而元素的添加又在directive2里,所以要怎么通訊呢,我選擇了事件的方式:
directive1 有代碼如下:
$scope.insertWidget = function(type){
$rootScope.$emit("widget.insert",type);
};
directive2 有代碼如下:
$rootScope.$on("widget.insert",function($event,type){
//功能代碼
});
當然這是有問題的。
當directive2里的scope被destroy的時候,它綁定的事件並沒有解除,因為綁定在$rootScope下了,所以當我再次操作時,事件會累加,導致再次刷新該頁面的時候,widget.insert事件累積了兩次,(以此累積)。
在我今天要完成的功能里就造成了影響,因為我是每添加一個元素會有$modal.open的操作,所以這樣我去關閉這個modal會累積關閉幾個,如果不解除的話。
所以解決方法是:
$on事件會返回一個函數,只要在當前scope被destroy時,執行這個函數就好了~見代碼:
var destroyInsert = $rootScope.$on("widget.insert",function($event,type){
//功能代碼
});
$scope.$on("$destroy",function(){
destroyInsert();
});
今天遇到的這個坑就解決啦~