摘要:因為在上的一旦注冊全局有效。而我的這個全局變量恰好是訂單信息,也就是說不同的對他都是有改動的,每一次改動就會觸發進入別的。可以類比看一下上的會全局出發的。例如手動清除還是很簡單對吧,以上方法同樣可以用于上的。
如果你只想知道結論:
$scope.$watch(function(){$rootScope.xxx;},function(newVal,oldVal){ //do something })
馬上就有人問為什么不是:
$rootScope.$watch("xxx",function(newVal,oldVal){ //do something })
從我最近的一個bug來說說為什么要用第一種方式。
邏輯如圖,一開始我使用了 $rootScope.$watch 的寫法。因為 angularjs 在 $rootScope 上的 watch 一旦注冊全局有效。而我的這個全局變量恰好是訂單信息,也就是說不同的 controller 對他都是有改動的,每一次改動就會觸發 $rootScope.$watch 進入別的 controller。可以類比看一下 $rootScope 上的 $broadcast 會全局出發的。
其實這并不是唯一的方式,查一下angular 源碼不難找到 watch 方法源碼不分有如下代碼:
return function deregisterWatch() { if (arrayRemove(array, watcher) >= 0) { incrementWatchersCount(scope, -1); } lastDirtyWatch = null; };
這段代碼告訴我們,手動清理 watch 是可行的。例如:
var watcher = $rootScope.$watch("xxx",function(){}); //手動清除 watcher watcher();
還是很簡單對吧,以上方法同樣可以用于 scope 上的 watch。
研究到這里的時候,覺得有點問題,那我在 $scope 會被清理么?于是呼,繼續翻源碼,我在 $destroy 方法里面找到如下代碼:
// Disable listeners, watchers and apply/digest methods this.$destroy = this.$digest = this.$apply = this.$evalAsync = this.$applyAsync = noop; this.$on = this.$watch = this.$watchGroup = function() { return noop; }; this.$$listeners = {};
以上代碼分析很有可能有錯,僅做參考,如有錯誤歡迎指正。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/78630.html
摘要:每個的指向指向父級作用域。之間的通信本質上是當前的所在的如何跟其他上的進行通信。傳遞事件有種方式觸發的事件要通知整個事件系統允許任意作用域處理這個事件就要向下傳播。作用域上使用進行事件監聽。示例關于同級之間通信我的一個提問 原文鏈接:http://www.cnblogs.com/webbes... AngularJS中的controller是個函數,用來向視圖的作用域($scope)添...
摘要:作為一個應該具有經常總結反思的習慣如果不能及時總結可能就會忘記自己踩過的很多坑然后會導致同一個坑踩很多次所以我打算把這些都記錄下來以方便是對自己的重復記憶避免無效的另一方面可以希望可以給遇到相似問題的同僚們一些收獲手動觸發臟檢查在開發過程中 作為一個coder,應該具有經常總結反思的習慣,如果不能及時總結,可能就會忘記自己踩過的很多坑,然后會導致同一個坑踩很多次,所以我打算把這些都記錄...
摘要:比如,我們可以監聽事件由實例發出,然后在任何瀏覽器中就是變化的時候都會得到通知,如下所示每一個作用域對象都會有這個方法,可以用來注冊一個作用域事件的偵聽器。這個函數所扮演的偵聽器在被調用時會有一個對象作為第一個參數。 上一篇:【譯】《精通使用AngularJS開發Web App》(二) 下一篇:【譯】《精通使用AngularJS開發Web App》(四) 書名:Mastering W...
閱讀 2843·2023-04-26 01:02
閱讀 1863·2021-11-17 09:38
閱讀 791·2021-09-22 15:54
閱讀 2899·2021-09-22 15:29
閱讀 888·2021-09-22 10:02
閱讀 3432·2019-08-30 15:54
閱讀 2007·2019-08-30 15:44
閱讀 1586·2019-08-26 13:46