详解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小功能(onmouseover实现选择月份)实例代码
Nov 28 Javascript
用javascript关闭本窗口技巧小结
Sep 05 Javascript
基于jQuery实现搜索关键字自动匹配功能
Mar 26 Javascript
jQuery使用EasyUi实现三级联动下拉框效果
Mar 08 Javascript
React 组件间的通信示例
Jun 14 Javascript
JavaScript常见事件处理程序实例总结
Jan 05 Javascript
超详细动手搭建一个VuePress 站点及开启PWA与自动部署的方法
Jan 27 Javascript
JS实现的新闻列表自动滚动效果示例
Jan 30 Javascript
vue项目中使用bpmn为节点添加颜色的方法
Apr 30 Javascript
Vue 中获取当前时间并实时刷新的实现代码
May 12 Javascript
JS实现canvas简单小画板功能
Jun 23 Javascript
vue使用vue-quill-editor富文本编辑器且将图片上传到服务器的功能
Jan 13 Vue.js
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与MySQL开发中页面乱码的产生与解决
2008/03/27 PHP
php cookis创建实现代码
2009/03/16 PHP
Windows 下的 PHP-PEAR 安装方法
2010/11/20 PHP
国外PHP程序员的13个好习惯小结
2012/02/20 PHP
PHP使用DOMDocument类生成HTML实例(包含常见标签元素)
2014/06/25 PHP
YII模块实现绑定二级域名的方法
2014/07/09 PHP
PHP+APACHE实现网址伪静态
2015/02/22 PHP
Smarty中的注释和截断功能介绍
2015/04/09 PHP
JavaScript实现滚动栏效果的方法
2015/04/27 PHP
WordPress中用于获取搜索表单的PHP函数使用解析
2016/01/05 PHP
php设计模式之原型模式分析【星际争霸游戏案例】
2020/03/23 PHP
两种方法实现文本框输入内容提示消失
2013/03/17 Javascript
javascript白色简洁计算器
2015/05/04 Javascript
jQuery对JSON数据进行排序输出的方法
2015/06/24 Javascript
JavaScript获取浏览器信息的方法
2015/11/20 Javascript
Bootstrap警告框(Alert)插件使用方法
2017/03/21 Javascript
JS全角与半角转化实例(分享)
2017/07/04 Javascript
jQuery获取复选框选中的当前行的某个字段的值
2017/09/15 jQuery
捕获未处理的Promise错误方法
2017/10/13 Javascript
vue+element实现批量删除功能的示例
2018/02/28 Javascript
vue移动端轻量级的轮播组件实现代码
2018/07/12 Javascript
Vue中div contenteditable 的光标定位方法
2018/08/25 Javascript
node中的密码安全(加密)
2018/09/17 Javascript
原生js实现二级联动菜单
2019/11/27 Javascript
vue实现数字滚动效果
2020/06/29 Javascript
Vue Element校验validate的实例
2020/09/21 Javascript
vue render函数动态加载img的src路径操作
2020/10/26 Javascript
vue+element table表格实现动态列筛选的示例代码
2021/01/14 Vue.js
nestjs返回给前端数据格式的封装实现
2021/02/22 Javascript
使用Python实现下载网易云音乐的高清MV
2015/03/16 Python
Python3 pandas 操作列表实例详解
2019/09/23 Python
JupyterNotebook 输出窗口的显示效果调整实现
2020/09/22 Python
下述程序的作用是计算机数组中的最大元素值及其下标
2012/11/26 面试题
公司年会晚宴演讲稿
2014/01/06 职场文书
党建示范点实施方案
2014/03/12 职场文书
2014年财务部工作总结
2014/11/11 职场文书