详解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代码
Nov 23 Javascript
同一页面多个商品倒计时JS 基于面向对象的javascript
Feb 16 Javascript
window.opener用法和用途实例介绍
Aug 19 Javascript
js获取当月最后一天实例代码
Nov 19 Javascript
js创建对象的方式总结
Jan 10 Javascript
jQuery移动页面开发中的触摸事件与虚拟鼠标事件简介
Dec 03 Javascript
jQuery计算文本框字数及限制文本框字数的方法
Mar 01 Javascript
Bootstrap 模态框(Modal)带参数传值实例
Aug 20 Javascript
vue.js路由跳转详解
Aug 28 Javascript
vscode配置vue下的es6规范自动格式化详解
Mar 20 Javascript
JavaScript实现横版菜单栏
Mar 17 Javascript
解决antd 下拉框 input [defaultValue] 的值的问题
Oct 31 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
Linux下ZendOptimizer的安装与配置方法
2007/04/12 PHP
编译php 5.2.14+fpm+memcached(具体操作详解)
2013/06/18 PHP
destoon调用自定义模板及样式的公告栏
2014/06/21 PHP
CodeIgniter框架数据库基本操作示例
2018/05/24 PHP
对YUI扩展的Gird组件 Part-2
2007/03/10 Javascript
Javascript 各浏览器的 Javascript 效率对比
2008/01/23 Javascript
jQuery帮助之筛选查找 children([expr])
2011/01/31 Javascript
基于jquery的一个拖拽到指定区域内的效果
2011/09/21 Javascript
jQuery EasyUI API 中文文档 - NumberSpinner数值微调器使用介绍
2011/10/21 Javascript
javascript记住用户名和登录密码(两种方式)
2015/08/04 Javascript
基于javascript实现彩票随机数生成(简单版)
2020/04/17 Javascript
laypage分页控件使用实例详解
2016/05/19 Javascript
详解Vue使用 vue-cli 搭建项目
2017/04/20 Javascript
JS实现发送短信验证后按钮倒计时功能(防止刷新倒计时失效)
2017/07/07 Javascript
微信小程序实现购物车代码实例详解
2019/08/29 Javascript
JavaScript之Blob对象类型的具体使用方法
2019/11/29 Javascript
在Vue中获取自定义属性方法:data-id的实例
2020/09/09 Javascript
浅谈Python中的闭包
2015/07/08 Python
Python实现多线程抓取网页功能实例详解
2017/06/08 Python
轻松实现TensorFlow微信跳一跳的AI
2018/01/05 Python
Python函数装饰器实现方法详解
2018/12/22 Python
python redis 删除key脚本的实例
2019/02/19 Python
python几种常用功能实现代码实例
2019/12/25 Python
python实现梯度下降和逻辑回归
2020/03/24 Python
什么是Python中的顺序表
2020/06/02 Python
惊艳的手工时装首饰:Migonne Gavigan
2018/02/23 全球购物
英国露营设备和户外服装购物网站:Simply Hike
2019/05/05 全球购物
飞利浦美国官网:Philips美国
2020/02/28 全球购物
交通安全演讲稿
2014/01/07 职场文书
幼儿园三八妇女节活动方案
2014/03/11 职场文书
运动会400米加油稿(8篇)
2014/09/22 职场文书
面试感谢信范文
2015/01/22 职场文书
奥巴马开学演讲观后感
2015/06/12 职场文书
2016公司新年问候语
2015/11/11 职场文书
Win11安装升级时提示“该电脑必须支持安全启动”
2022/04/19 数码科技
Java结构型设计模式之组合模式详解
2022/09/23 Java/Android