分享人:张智
目录
1.背景介绍
2.知识剖析
3.常见问题
4.解决方案
5.编码实战
6.扩展思考
7.参考文献
8.更多讨论
AngularJS不仅是一个理念先进(逼格高)的前端开发框架,更是一种端对端(End to End)的解决方案。AngularJS遵从架构设计中的MVC模式,提倡展现、数据和逻辑处理组件的松耦合(类似Flex和WPF)。AngularJS通过指令技术对传统HTML实现了自然扩展,通过编译技术实现了数据模型与展现视图的双向自动同步,从而消除了前端开发中繁琐复杂的DOM操作。 最后再通过模块化设计解决了JS代码管理维护和按需加载的问题,解放了广大前端程序员(以及后端程序员)同胞完成前端开发任务的生产力。而且这种解耦本身,也对前端的自动化测试技术提供了良好的支持。 而$scope $rootScope $watch 和 $state就是里面的几个方法
$scope在angularjs中,你可以把它理解成作用域,每个不同的controller,都具有它不同的作用域,所以controller不同,他们的scope是不同的。当你在 AngularJS 创建控制器时,你可以将 $scope 对象当作一个参数传递当在控制器中添加 $scope 对象时,视图 (HTML) 可以获取了这些属性。视图中,你不需要添加 $scope 前缀, 只需要添加属性名即可
$rootScope就相当于一个全局作用域,所以我们保存在其中的东西是全局性的,在任一controller之中都能够使用 scope是html和单个controller之间的桥梁,数据绑定就靠他了。rootscope是各个controller中scope的桥梁。 用rootscope定义的值,可以在各个controller中使用。
相信使用过angularjs的同学都知道,ng中有个比较重要的特点,叫做双向绑定,那么这个双向绑定是如何实现的呢?
当我们在创建出scope下的一个新属性的时候,ng就会主动为我们新属性加上$watch这个方法,这个方法会监听我们
的数据变化,当数据变化之后,就立即把view和scope上数据同步。
$watch(watchExpression, listener, objectEquality);
watchExpression,需要监控的表达式
listener,处理函数,函数参数如下
function(newValue,oldValue, scope)
objectEquality,是否深度监听,如果设置为true,它告诉Angular检查所监控的对象中每一个属性的变化.
如果你希望监控数组的个别元素或者对象的属性而不是一个普通的值,那么你应该使用它
检测的对象:
1. 某个数据,监测这个数据的值是否发生变化 2. 一条angular表达式,监测表达式的结果是否发生变化 3. 函数(),监测函数的返回值是否发生变化 注意,以上三种,无论是哪种,都应该是字符串格式,并且都是在$scope作用域下执行的. 4.函数,非字符串格式,而是直接传入一个函数,可以直接写一个匿名函数,也可以传入一个函数,注意,它不是在$scope作用域下的,所以,如果传入的是当前作用域下的函数,还是需要写 在digest执行时,如果watch观察的的value与上一次执行时不一样时,就会被触发。 AngularJS内部的watch实现了页面随model的及时更新。 $watch方法在用的时候主要是手动的监听一个对象,但对象发生变化时触发某个事件。
路由,$state就是路由中的一项服务。 $state.go()——$state.go()方法可以产生与a链接一样的效果,可以将此方法绑定给一个button按钮, 然后在按钮的点击事件中执行 $state.go(),就可以跳转到相应的页面。 $stateparams——$stateParams是一个对象,包含 url 中每个参数的键/值。$stateParams可以为控制器或者服务提供 url 的各个部分。 注意:$stateParams必须与一个控制器相关,并且$stateParams中的“键/值”也必须事先在那个控制器的url属性中有定义。
watch的深度监听是什么意思呢?有什么优缺点呢?
$watch在对待原始类型和引用类型会有不同的处理方式,这就要首先说一说$watch函数的第三个参数。 $watch函数有接收两个参数,第一个参数是需要监视的对象, 第二个参数是在监视对象发生变化时需要调用的函数, 实际上$watch还有第三个参数,它在默认情况下是false。 在默认情况下,即不显式指明第三个参数或者将其指明为false时, 我们进行的监视叫做“引用监视”。 引用监视的原词的“reference watch”,它的意思是只要监视的对象引用没有发生变化, 就不算它发生了变化。
如果我们将$watch的第三个变量设置为true,那么此时我们进行的监视叫做“全等监视”,原词是“equality watch”。 此时,只要$watch的对象有一点风吹草动,它马上就跳出来 既然全等监视这么好,那么我们为什么不直接用全等监视呢? 当然,任何事情都有好的坏的两个方面,全等监视固然是好, 但是它在运行时需要先遍历整个监视对象, 然后在每次$digest之前使用angular.copy()将整个对象深拷贝一遍然后在运行之后用angular.equal()将前后的对象进行对比。
angular会为我们自动执行$watch,当指令中有独立作用域,或者在异步函数中,改变的数据不在angular的执行上下文,就需要手动调用$apply 来触发$digest去执行$watch
参考一: AngularJS Scope(作用域)
参考二: angularJS介绍
感谢大家观看
BY : 张智