详解angular中的作用域及继承


Posted in Javascript onMay 31, 2017

在一些使用angular框架的大型项目中,似乎有很多个controller,而每个controller都有自己的$scope.

1、$rootscope

$rootScope顶级作用域,也叫根作用域,类似于window,window的属性在任何子作用域都可以访问。$rootScope则是所有controller进行数据沟通的中间域,即在$rootScope中的数据,在每个controller中都能通过$rootScope.xxx获取到。

2、$scope

(1)作用

$scope 就在视图和控制器之间建立了一个桥梁,基于作用域视图在修改数据时会立刻更新 $scope,同样的 $scope 发生改变时也会立刻重新渲染视图.每个控制器controller对应一个$scope,通过为其属性赋值,可以传递数据给模板渲染.

(2)生命周期

创建:在创建控制器或指令时,AngularJS会用$injector创建一个新的作用域,并在这个新建的控制器或指令运行时将作用域传递进去。

链接:当Angular开始运行时,所有的$scope对象都会附加或者链接到视图中。所有创建$scope对象的函数也会将自身附加到视图中。这些作用域将会注册当Angular应用上下文中发生变化时需要运行的函数。这些函数被称为$watch函数,Angular通过这些函数获知何时启动事件循环。

更新:当事件循环运行时,它通常执行在顶层$scope对象上(被称作$rootScope),每个子作用域都执行自己的脏值检测。每个监控函数都会检查变化。如果检测到任意变化,$scope对象就会触发指定的回调函数。
销毁:当一个$scope在视图中不再需要时,这个作用域将会清理和销毁自己。尽管永远不会需要清理作用域(因为Angular会为你处理),但是知道是谁创建了这个作用域还是有用的,因为你可以使用这个$scope上叫做$destory()的方法来清理这个作用域。

3、原型继承

scope是AngularJS中的作用域(其实就是存储数据的地方),很类似JavaScript的原型链 。搜索的时候,优先找自己的scope,如果没有找到就沿着作用域链向上搜索,直至到达根作用域rootScope。

<!DOCTYPE html>
          <html>
          <head>
           <title></title>
          </head>
          <body ng-app="myApp">
          <div ng-controller="parentController">
            {{name}}
            <div ng-controller="sonController">
              {{name}}
            </div>
          </body>
          <script type="text/javascript" src="./angular.min.js"></script>
          <script>
            var parentController=function($scope){
              $scope.name="parent";
            }
            var sonController=function($scope){
              console.log($scope.name);//parent
            }
            parentController.$injector=["$scope"];
            sonController.$injector=["$scope"];
            angular.module("myApp",[])
            .controller("parentController",parentController)
            .controller("sonController",sonController)
          </script>
          </html>

首先子控制器在自己的作用域内查找name属性,没找到,向父控制器找。

补充一点,如何在子控制器中修改父控制器中$scope的值,可见如下:

$scope.$parent.name="son";在子控制器中$scope.$parent就表示父控制器中的$scope,然后修改其值即可。

4、$new

$scope.$new(isolated,parent);用于定义scope的child scope

1)参数:isolated,是否是隔离的。如果值是true,那么这个scope不会从父scope继承原型。作用域是独立的,在这里不能看见父scope的属性。如果值为false,则继承自父(可以访问父scope的所有成员),默认为false!

parent  用于指定创建的子scope的父scope,如果没有此参数,则父scope为调用当前$new方法的$scope

var myController=function($scope){
    $scope.data="hello!"
    var scope1=$scope.$new(false,$scope);
    console.log(scope1.data); //hello! scope1继承了$scope,所以可以访问到data
    var scope2=$scope.$new(true,$scope); 
    console.log(scope2.data);// undefined 第一个参数为true,表示是隔离的,无法继承,自己又没有,故为undefined
  }
  myController.$injector=["$scope"];
  angular.module("myApp",[])
  .controller("myController",myController)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
不间断滚动JS打包类,基本可以实现所有的滚动效果,太强了
Dec 08 Javascript
使用jQuery和PHP实现类似360功能开关效果
Feb 12 Javascript
自定义jquery模态窗口插件无法在顶层窗口显示问题
May 29 Javascript
利用jQuery实现漂亮的圆形进度条倒计时插件
Sep 30 Javascript
解决js函数闭包内存泄露问题的办法
Jan 25 Javascript
javascript每日必学之基础入门
Feb 16 Javascript
AngularJS extend用法详解及实例代码
Nov 15 Javascript
JavaScript中英文字符长度统计方法示例【按照中文占2个字符】
Jan 17 Javascript
jquery插件ContextMenu设置右键菜单
Mar 13 Javascript
基于canvas粒子系统的构建详解
Aug 31 Javascript
node+koa2+mysql+bootstrap搭建一个前端论坛
May 06 Javascript
jQuery实现点击自身以外区域关闭弹出层功能完整示例【改进版】
Jul 31 jQuery
Node学习记录之cluster模块
May 31 #Javascript
Express框架之connect-flash详解
May 31 #Javascript
node.js中express-session配置项详解
May 31 #Javascript
详解angularjs中如何实现控制器和指令之间交互
May 31 #Javascript
详解angularjs中的隔离作用域理解以及绑定策略
May 31 #Javascript
JS简单实现自定义右键菜单实例
May 31 #Javascript
页面间固定参数,通过cookie传值的实现方法
May 31 #Javascript
You might like
与数据库连接
2006/10/09 PHP
Laravel 自定命令以及生成文件的例子
2019/10/23 PHP
ASP中用Join和Array,可以加快字符连接速度的代码
2007/08/22 Javascript
javascript中的delete使用详解
2013/04/11 Javascript
用jQuery获取IE9下拉框默认值问题探讨
2013/07/22 Javascript
3种不同方式的焦点图轮播特效分享
2013/10/30 Javascript
Jquery getJSON方法详细分析
2013/12/26 Javascript
常用DOM整理
2015/06/16 Javascript
JS实现的竖向折叠菜单代码
2015/10/21 Javascript
Javascript之Date对象详解
2016/06/07 Javascript
jQuery实现简单倒计时功能的方法
2016/07/04 Javascript
原生js仿jquery animate动画效果
2016/07/13 Javascript
Angular2 http jsonp的实例详解
2017/08/31 Javascript
jQuery实现提交表单时不提交隐藏div中input的方法
2019/10/08 jQuery
javascript中的相等操作符(==与===区别)
2019/12/21 Javascript
使用JavaScript通过前端发送电子邮件
2020/05/22 Javascript
Vue.js中Line第三方登录api的实现代码
2020/06/29 Javascript
js实现查询商品案例
2020/07/22 Javascript
[01:18:35]DOTA2-DPC中国联赛 正赛 Elephant vs LBZS BO3 第一场 1月29日
2021/03/11 DOTA
详解Python迭代和迭代器
2016/03/28 Python
python使用str &amp; repr转换字符串
2016/10/13 Python
python itchat实现微信自动回复的示例代码
2017/08/14 Python
python实现按长宽比缩放图片
2018/06/07 Python
python判断输入日期为第几天的实例
2018/11/13 Python
Pytorch根据layers的name冻结训练方式
2020/01/06 Python
通过python调用adb命令对App进行性能测试方式
2020/04/23 Python
Pycharm生成可执行文件.exe的实现方法
2020/06/02 Python
adidas澳大利亚官方网站:adidas Australia
2018/04/15 全球购物
巴西女装购物网站:Eclectic
2018/04/24 全球购物
美国批发供应商:Kole Imports
2019/04/10 全球购物
自荐信格式范文
2013/10/07 职场文书
部门活动策划方案
2014/08/16 职场文书
2014小学数学教师个人工作总结
2014/12/18 职场文书
广告公司文案策划岗位职责
2015/04/14 职场文书
考研经验交流会策划书
2015/11/02 职场文书
辞职信怎么写?你都知道吗?
2019/06/24 职场文书