详解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 相关文章推荐
jquery必须知道的一些常用特效方法及使用示例(整理)
Jun 24 Javascript
解析dom中的children对象数组元素firstChild,lastChild的使用
Jul 10 Javascript
JavaScript的继承的封装介绍
Oct 15 Javascript
利用CSS、JavaScript及Ajax实现高效的图片预加载
Oct 16 Javascript
javascript静态页面传值的三种方法分享
Nov 12 Javascript
JavaScript使用Replace进行字符串替换的方法
Apr 14 Javascript
jQuery实现类似淘宝网图片放大效果的方法
Jul 08 Javascript
JavaScript错误处理和堆栈追踪详解
Apr 18 Javascript
详解Vue打包优化之code spliting
Apr 09 Javascript
VUE 实现滚动监听 导航栏置顶的方法
Sep 11 Javascript
vue render函数动态加载img的src路径操作
Oct 26 Javascript
JavaScript架构localStorage特殊场景下二次封装操作
Jun 21 Javascript
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
Ajax+PHP 边学边练 之二 实例
2009/11/24 PHP
ajax php传递和接收变量实现思路及代码
2012/12/19 PHP
让Firefox支持event对象实现代码
2009/11/07 Javascript
JS实现字体选色板实例代码
2013/11/20 Javascript
《JavaScript函数式编程》读后感
2015/08/07 Javascript
jquery checkbox的相关操作总结
2016/10/17 Javascript
js实现选项卡内容切换以及折叠和展开效果【推荐】
2017/01/08 Javascript
微信小程序图片横向左右滑动案例
2017/05/19 Javascript
一步步教会你微信小程序的登录鉴权
2018/04/09 Javascript
详解vuex中mapState,mapGetters,mapMutations,mapActions的作用
2018/04/13 Javascript
基于AngularJS拖拽插件ngDraggable.js实现拖拽排序功能
2019/04/02 Javascript
vue+web端仿微信网页版聊天室功能
2019/04/30 Javascript
js中的this的指向问题详解
2019/08/29 Javascript
node 版本切换的实现
2020/02/02 Javascript
javascript将扁平的数据转为树形结构的高效率算法
2020/02/27 Javascript
jQuery实现的解析本地 XML 文档操作示例
2020/04/30 jQuery
jQuery实现可以计算进制转换的计算器
2020/10/19 jQuery
[01:58]最残酷竞争 2016国际邀请赛中国区预选赛积分循环赛回顾
2016/06/28 DOTA
Python数据结构之顺序表的实现代码示例
2017/11/15 Python
使用pandas对两个dataframe进行join的实例
2018/06/08 Python
win10下tensorflow和matplotlib安装教程
2018/09/19 Python
在python中实现同行输入/接收多个数据的示例
2019/07/20 Python
使用Python函数进行模块化的实现
2019/11/15 Python
python中执行smtplib失败的处理方法
2020/07/01 Python
HTML5 播放 RTSP 视频的实例代码
2019/07/29 HTML / CSS
Liu Jo西班牙官网:意大利服装品牌
2019/09/11 全球购物
酒店前厅员工辞职信
2014/01/08 职场文书
《玩具柜台前的孩子》教学反思
2014/02/13 职场文书
先进工作者个人总结
2015/02/15 职场文书
运动会100米加油稿
2015/07/21 职场文书
公司员工宿舍管理制度
2015/08/03 职场文书
交通安全教育主题班会
2015/08/12 职场文书
2016大学生入党积极分子心得体会
2016/01/06 职场文书
2016年度先进班组事迹材料
2016/03/01 职场文书
python爬不同图片分别保存在不同文件夹中的实现
2021/04/02 Python
MySQL实现字段分割一行转多行的示例代码
2022/07/07 MySQL