详解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 相关文章推荐
Mootools 图片展示插件(lightbox,ImageMenu)收集集合
May 21 Javascript
JS 去前后空格大全(IE9亲测)
Jul 15 Javascript
查找iframe里元素的方法可传参
Sep 11 Javascript
JS结合bootstrap实现基本的增删改查功能
Jul 22 Javascript
js显示动态时间的方法详解
Aug 20 Javascript
浅谈js数据类型判断与数组判断
Aug 29 Javascript
在web中js实现类似excel的表格控件
Sep 01 Javascript
AngularJS实践之使用NgModelController进行数据绑定
Oct 08 Javascript
jQuery 中msgTips 顶部弹窗效果实现代码
Aug 14 jQuery
Vue网页html转换PDF(最低兼容ie10)的思路详解
Aug 24 Javascript
vue-router 前端路由之路由传值的方式详解
Apr 30 Javascript
Vue.js 中的实用工具方法【推荐】
Jul 04 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
PHP 高手之路(二)
2006/10/09 PHP
PHP daddslashes 使用方法介绍
2012/10/26 PHP
PHP中SSO Cookie登录分析和实现
2015/11/06 PHP
PHP getallheaders无法获取自定义头(headers)的问题
2016/03/23 PHP
Symfony2针对输入时间进行查询的方法分析
2017/06/28 PHP
PHP排序二叉树基本功能实现方法示例
2018/05/26 PHP
jQuery UI Autocomplete 体验分享
2012/02/14 Javascript
jQuery实现简单网页遮罩层/弹出层效果兼容IE6、IE7
2014/06/16 Javascript
使用typeof方法判断undefined类型
2014/09/09 Javascript
jQuery实现购物车数字加减效果
2015/03/14 Javascript
基于jQuery实现在线选座之高铁版
2015/08/24 Javascript
js实现简单排列组合的方法
2016/01/27 Javascript
webpack2.0配置postcss-loader的方法
2017/08/17 Javascript
Vue父子模版传值及组件传值的三种方法
2017/11/27 Javascript
微信小程序实现的3d轮播图效果示例【基于swiper组件】
2018/12/11 Javascript
vue中子组件传递数据给父组件的讲解
2019/01/27 Javascript
微信小程序实现页面浮动导航
2019/01/28 Javascript
iview tabs 顶部导航栏和模块切换栏的示例代码
2019/03/04 Javascript
Vue实现简单的跑马灯
2020/05/25 Javascript
Nuxt 项目性能优化调研分析
2020/11/07 Javascript
[03:02]2020完美世界城市挑战赛(秋季赛)总决赛回顾
2021/03/11 DOTA
在Python的Django框架中实现Hacker News的一些功能
2015/04/17 Python
Django中对通过测试的用户进行限制访问的方法
2015/07/23 Python
Python实现字典的key和values的交换
2015/08/04 Python
删除DataFrame中值全为NaN或者包含有NaN的列或行方法
2018/11/06 Python
pygame游戏之旅 添加游戏暂停功能
2018/11/21 Python
python使用for...else跳出双层嵌套循环的方法实例
2020/05/17 Python
八皇后问题,输出了所有情况,不过有些结果只是旋转了90度
2016/08/15 面试题
网游商务专员求职信
2013/10/15 职场文书
《雨点》教学反思
2014/02/12 职场文书
吃空饷专项治理工作实施方案
2014/03/04 职场文书
三爱活动实施方案
2014/03/19 职场文书
党支部承诺书范文
2014/03/28 职场文书
领导班子四风对照检查材料思想汇报
2014/09/26 职场文书
英文感谢信范文
2015/01/21 职场文书
班主任高考寄语
2015/02/26 职场文书