一、scope
scope是一个把view(页面或者模板中DOM元素)连结到controller上的对象)
<p ng-bind="txt"></p>
var app = angular.module('myApp',[])
app.controller('myCtrl',function($scope){
$scope.txt = '佛系四大皆空';
})
1、$scope 实际上就是一个JavaScript对象,controller和view都可以访问它,所以我们可以利用它在两者间传递信息
2、这个 $scope 对象里,我们既存储数据,又存储将要运行在view上的函数
$scope生命周期
总结:创建---->注册监控---->检测模型的变化---->观察模型有没有“脏”---->自动销毁
1、创建:在创建控制器或指令时,AngularJS会用$injector(参考理解angular中的module和injector,即依赖注入)创建一个新的作用域,并在这个新建的控制器或指令运行时将作用域传递进去
2、链接:当Angular开始运行时,所有的 scope对象都会附加或者链接到视图中, 这些作用域将会注册当Angular应用上下文中发生变化时所需要运行的函数。 这些函数被称为$watch函数,Angular通过这些函数获知何时启动事件循环
3、更新:当事件循环运行时,它通常执行在$rootScope上。每个子作用域都执行自己的脏值检测,每个监控函数都会检查变化。如果检测到任意变化,scope对象就会触发指定的回调函数
4、销毁:当一个$scope在视图中不再需要时,这个作用域将会清理和销毁自己。基本上不会需要你来清理作用域,但是你还是可以使用scope上的destroy()方法来清理作用域
filter过滤器
1.作用就是接收一个输入,通过某个规则进行处理,然后返回处理后的结果,主要用在数据的格式化上
2.filter的两种使用方法:
1)在模板(html)中使用filter
(1)直接在{{}}中使用filter,跟在表达式后面用 | 分割
例如:{{ expression | filter }}
(2)也可以多个filter连用,上一个filter的输出将作为下一个filter的输入
例如:{{ expression | filter1 | filter2 | ... }}
(3)filter可以接收参数,参数用 : 进行分割
例如:{{ expression | filter:argument1:argument2:... }}
(4)除了对{{}}中的数据进行格式化,我们还可以在指令中使用filter,例如先对数组array进行过滤处理,然后再循环输出
例如:<span ng-repeat="a in array | filter ">
-----------------------------------------------------------------------
2)在controller和service中使用filter
(1)js代码中也可以使用过滤器,方式就是我们熟悉的依赖注入
例如:app.controller('testC',function($scope,currencyFilter){
$scope.num = currencyFilter(123534);
}
在模板中使用{{num}}就可以直接输出$123,534.00了,ps:在服务中也一样
(2)controller中使用多个filter,只需注入一个$filter就够了
例如:app.controller('testC',function($scope,$filter){
$scope.num = $filter('currency')(123534);
$scope.date = $filter('date')(new Date());
}
3.内置过滤器(取之用之)
1)currency (货币处理)
(1)使用currency可以将数字格式化为货币,默认是美元符号,也可以自己传入所需的符号
{{num | currency : '¥'}}
2)date (日期格式化)
(1){{date | date : 'yyyy-MM-dd hh:mm:ss EEEE'}}
(2)y M d h m s E 分别表示 年 月 日 时 分 秒 星期,可以自由组合它们
3)filter(匹配子串)
(1)用来处理一个数组,然后可以过滤出含有某个子串的元素,作为一个子数组来返回
(2)可以是字符串数组,也可以是对象数组。如果是对象数组,可以匹配属性的值
(3){{ childrenArray | filter : 'a' }} // 匹配属性值中含有a的
(4){{ childrenArray | filter : {name : 'i'} }} // 参数是对象,匹配name属性中含有i的
(5){{childrenArray | filter : func }} // 参数是函数,指定返回age>4的
$scope.func = function(e){return e.age>4;}
4)json(格式化json对象)
(1)json过滤器可以把一个js对象格式化为json字符串,没有参数
5)limitTo(限制数组长度或字符串长度)
(1)limitTo过滤器用来截取数组或字符串,接收一个参数用来指定截取的长度,如果参数是负值,则从数组尾部开始截取
(2){{ childrenArray | limitTo : 2 }} // 将会显示数组中的前两项
6) lowercase(小写)
(1)把数据转化为全部小写
7)uppercase(大写)
(2)把数据转化为全部大写
8)number(格式化数字)
(1)number过滤器可以为一个数字加上千位分割,像这样,123,456,789,同时接收一个参数,可以指定float类型保留几位小数
(2){{ num | number : 2 }}
9)orderBy(排序)
(1)可以将一个数组中的元素进行排序
(2)接收一个参数来指定排序规则,参数可以是一个字符串,表示以该属性名称进行排序
例如:<div>{{ childrenArray | orderBy : 'age' }}</div> // 按age属性值进行排序,若是-age,则倒序
(3)可以是一个函数,定义排序属性。
例如:<div>{{ childrenArray | orderBy : orderFunc }}</div> // 按照函数的返回值进行排序
(4)还可以是一个数组,表示依次按数组中的属性值进行排序(若按第一项比较的值相等,再按第二项比较)
例如:<div>{{ childrenArray | orderBy : ['age','name'] }}</div> // 如果age相同,按照name进行排序
4.自定义过滤器
1)使用module的filter方法,返回一个函数,该函数接收输入值,并返回处理后的结果
2)实例:
<div class="{{weather | ClassFormat}}">{{weather}}</div>
app.filter('ClassFormat',function(){
return function(value){
if(value == '晴'){
return value = 'sun';
}
}
})
app.filter('odditems',function(){
return function(inputArray){
var array = [];
for(var i=0;i<inputArray.length;i++){
if(i%2!==0){
array.push(inputArray[i]);
}
}
return array;
}
});
使用自定义filter控制类名不止是否合理,亲测可正常使用。