$observe $watch均可以用來監聽值的變化,可是他們有顯著的區別。$observe是用來監視DOM屬性值的變化,而 $watch監視scope屬性值的變化。AngularJS中的監聽,都知道的有$watch,還有一種監聽是$observe,$watch主要監聽的是$scope上的屬性,而$observe監聽的是directive中attrs上的屬性。express
attrs.$observe('attr1', ....)
ide
scope.$watch(「model.property」...)函數
1、要點測試
一、$watch
spa
$watch()
是angular
上scope
對象的一個方法。控制器
中使用$watch()
;由於這樣使得測試
和維護
變得很困難。link
函數中使用,這是一種推薦的方式。angular expression
的變化,還能夠檢測function(){}
函數的變化,監測angular expression
的時候會使用$parse
將angular expression
解析爲一個函數,這個函數會在angular
的每一個髒值檢查
循環中被調用。 二、$observe
code
$observe()
是angular
指令中link
函數中實例屬性
即(iAttr
)的一個方法。link
函數中使用。angular expression
的變化,監測的方式和上面$watch()
監測angular expression
的方式同樣。2、區別對象
$observe是屬性對象上的方法,所以它是用來監控DOM屬性上的值的變化,它僅用在指令內部,當你須要在指令內部監控包含有插值表達式({{}})的DOM屬性的時候,就要用到這個方法,好比,blog
attr1="Name:{{name}}"
,element
而後在指令裏面:attrs.$observe('attr1', ....)
,作用域
可是假如你只用scope.$watch(attrs.attr1,...)
,這種狀況下是無效的,由於{{}}
沒法被解析,因此你獲得的是undefined
, 在其餘狀況下用$watch。
一、指令(不使用隔離的做用域)
在不使用隔離的做用域的指令
中,$watch()
只可以監測不帶有插值標記({{}})的angular expression
,好比在<div attr1='expr' attr2='{{expr}}'></div>
中,只能夠監測attr1='expr'
中的attr1
,監測attr2
只可以獲得一個undefined
,由於存在{{}}
插值符號。
在不使用隔離的做用域的指令
中,$observe()
只可以監測帶有插值標記的angular expression
,好比在<div attr1='expr' attr2='{{expr}}'></div>
中,只能夠監測attr2='{{expr}}'
中的attr2
,監測attr1
只會獲得一個一成不變的字符串expr
。
二、指令(使用隔離的做用域)
在使用隔離的做用域的指令中
,$watch()
也能夠監測帶有插值標記({{}})的angular expression
;由於使用了@
或者=
前綴標識符,它們已經幫咱們實現了插值
,因此能夠這樣使用。
3、例子
一、$watch
currentChargeType爲$scope上的內容
var initWatch = function () { var closeWatchMethod = $scope.$watch('currentChargeType', function (newValue, oldValue) { if (!newValue) return; $scope.currentChargeApplyType = chargeBaseToolUtil.upperWordFirst(newValue) + 'Charge'; initComboBox(); closeWatchMethod(); }); };
二、$observe
attrs.$observe('popShow', function (val) { $timeout(function () { var event = (val && (val == 'true' || val == true)) ? 'show' : 'hide'; element.popover(event); }); });