1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
var
firstController =
function
($scope){
$scope.name=
'张三'
;
$scope.count=0;
// 监听一个model 当一个model每次改变时 都会触发第2个函数
$scope.$watch(
'name'
,
function
(newValue,oldValue){
++$scope.count;
if
($scope.count > 30){
$scope.name =
'已经大于30次了'
;
}
});
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<!DOCTYPE html>
<
html
>
<
head
>
<
meta
charset
=
"utf-8"
>
</
head
>
<
body
>
<
div
ng-app
=
""
>
<
div
ng-controller
=
"firstController"
>
<
input
type
=
"text"
value
=
""
ng-model
=
"name"
/>
改变次数:{{count}}-{{name}}
</
div
>
</
div
>
<
script
type
=
"text/javascript"
src
=
"app/index.js"
></
script
>
<
script
type
=
"text/javascript"
src
=
"../../vendor/angular/angularjs.js"
></
script
>
</
body
>
</
html
>
|
1
2
3
4
|
$scope.data = {
name :
'李四'
,
count:20
}
|
1
2
3
|
$scope.$watch(
'data'
,
function
(){
},
true
)
|
$watch方法,它可以帮助我们在每个scope中监视其中的变量。
$watch 单一的变量
对于普通的变量时,如数字,字符串等,直接如下写是可以监视到变量的变化,并执行相应的函数的。
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
$watch 多个变量
对于多个变量的监视变化,执行同一函数的话,可以将这几个变量转为字符串,以‘+’号隔开来进行监视
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
$watch对象或数组
发现用上面两种方法去监视数组时,会发现即使数组的内容改变了,也没有触发到这个匿名函数。之后发现
watch函数其实是有三个变量的,第一个参数是需要监视的对象,第二个参数是在监视对象发生变化时需要调用的函数,实际上
watch还有第三个参数,它在默认情况下是false。
当第三个参数是false时,其实
watch函数监视的是数组的地址,而数组的内容的变化不会影响数组地址的变化,所以
watch函数失灵了。
解决办法,就是在后面添加第三个参数为true就好(当然,也可以将这监听返回结果为JSON字符串形式的该对象或数组的的匿名函数。)
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
或者将监听返回结果为JSON字符串形式的该对象或数组的的匿名函数
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 1
- 2
- 3
- 4
- 5
- 6
- 7
$watch 函数的返回结果
在写代码的时候,有时会遇到要监视一个函数返回的结果是否变化的情况,所以查了一下$watch 监视函数的情况。
方法1:监视对象为“函数名()”的字符串,记得加“()”!
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
方法2:在监视对象中设置为匿名函数,返回要监视的函数的返回值(绕晕了…)
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
取消$watch
watch的性能消耗好像蛮大的,所以对于已经不需要监视的
watch,记得定时取消掉。
至于怎么取消了…查了好久才找到的
其实每个
watch函数返回的结果就是这个
watch的deregisterWatch()函数
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
所以啊,要取消watch的话,一开始将$watch的返回值保存就好啦,要取消watch的时候,在调用。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10