深入探究AngularJs之$scope对象(作用域)


Posted in Javascript onJuly 20, 2017

这两天学习了AngularJs之$scope对象这个地方知识点挺多的,而且很重要,所以,今天添加一点小笔记。

一、作用域

AngularJs中的$scope对象是模板的域模型,也称为作用域实例.通过为其属性赋值,可以传递数据给模板渲染.

每个$scope都是Scope类的实例,Scope类有很多方法,用于控制作用域的生命周期、提供事件传播功能,以及支持模板的渲染等.

AngularJs的每个应用程序都有一个$rootScope,它是其他所有作用域的父作用域,它的作用范围从包含ng-app指令的HTML元素开始.它是在新应用启动时自动创建.

深入探究AngularJs之$scope对象(作用域) 

二、指令创建作用域

ng-controller指令是作用域创建指令,当在DOM树中遇到作用域创建指令时,AngularJs都会创建Scope类的新实例$scope.新创建的作用域实例$scope会拥有$parent属性,并指向它的父作用域.在DOM树中,会有很多这样的指令创建出很多作用域.

(众多作用域形成了以$rootScope为根的树结构,鉴于DOM树驱动了作用域的创建,作用域树模仿了DOM树的结构)

ng-repeat指令的运用:

<!DOCTYPE html>

<html>

  <head>

    <meta charset="utf-8" />

    <title></title>

  </head>

  <body >

    <ul ng-app="myApp" ng-controller="WorldCtrl">

    <li ng-repeat="country in countries">

      {{country.name}} 有 {{country.population}} 人口

    </li>

    <hr>

    世界人口数:{{population}}

    </ul>

 

  </body>

  <script type="text/javascript" src="js/angular.js" ></script>

  <script src="js/myapp.js"></script>

  <!--<script type="text/javascript" src="js/angularjs.js" ></script>-->

</html>

myapp.js

var app = angular.module("myApp",[]);

app.controller('WorldCtrl',function($scope){

  $scope.population = 7000;

  $scope.countries = [

    {name: 'France',population:63.1},

    {name: 'UK',population: 61.8},

  ];<br>});

测试结果:

深入探究AngularJs之$scope对象(作用域)

 ng-repeat指令用来遍历属性值,上面对应每个country,都有个新变量要暴露给$scope,而又没有覆盖之前变量的值;AngularJs中给集合中的每个元素都创建了新的作用域,所以在不同作用域中,定义同名变量,不会造成命名的冲突(不同的DOM元素指向不同的作用域,并使用各自作用域中的变量渲染模板).这相当于集合中每个项目都有自己的命名空间.

三、作用域层级和继承

作用域中定义的属性对于所有子作用域是可见的,只要子作用域中没有定义同名的属性.

实例:

<!DOCTYPE html>

<html ng-app="myApp">

  <head>

    <meta charset="UTF-8">

    <title></title>

  </head>

  <body ng-init="name='world'">

    <h1>Hello,{{name}}</h1>

    <div ng-controller="HelloCtrl">

     Say hello to:<input type="text" ng-model="name">

     <h1>Hello,{{name}}!!</h1>

    </div>

  </body>

  <script type="text/javascript" src="js/angular.js" ></script>

  <script type="text/javascript" src="js/controller.js" ></script>

</html>

controller.js

var app = angular.module("myApp",[])

app.controller("HelloCtrl", function($scope) {

// $scope.name = "youyi";

});

结果:

深入探究AngularJs之$scope对象(作用域)

在父作用域中定义了变量,子作用域中暂时未定义同名变量,可以看到在父作用域中定义的变量在整个应用程序中到处可见.

如果子作用域中有同名属性:

深入探究AngularJs之$scope对象(作用域)

深入探究AngularJs之$scope对象(作用域)

AngularJs中的作用域继承和JavaScript中的原型继承遵循同样的规则(沿着继承树向上查找属性,直至找到为止)。

改变子作用域中的变量值,不会对负作用域中的同名变量产生影响。

深入探究AngularJs之$scope对象(作用域)

通过下面的方式可以让子作用域中影响定义在父作用域中的属性:

但是这种方式是不可靠的,问题在于ng-model指令所用的表达式对DOM结构做了武断的假设,尽量避免使用$parent。

 深入探究AngularJs之$scope对象(作用域)

深入探究AngularJs之$scope对象(作用域)

更好的解决方案:

<!DOCTYPE html>

<html ng-app="myApp">

  <head>

    <meta charset="UTF-8">

    <title></title>

  </head>

  <body ng-init="thing={name:'world'}">

    <h1>Hello,{{thing.name}}</h1>

    <div ng-controller="HelloCtrl">

     Say hello to:<input type="text" ng-model="thing.name">

     <h1>Hello,{{thing.name}}!!</h1>

    </div>

  </body>

  <script type="text/javascript" src="js/angular.js" ></script>

  <script type="text/javascript" src="js/controller.js" ></script>

</html>
var app = angular.module("myApp",[])

app.controller("HelloCtrl", function($scope) {

  $scope.name = "youyi";

});

结果:

深入探究AngularJs之$scope对象(作用域)

改变表单中的值结果如下:

 深入探究AngularJs之$scope对象(作用域)

避免直接绑定变量给作用域属性,对象属性的双向数据绑定是最好的解决方案。

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

Javascript 相关文章推荐
javascript动画效果类封装代码
Aug 28 Javascript
拖动table标题实现改变td的大小(css+js代码)
Apr 16 Javascript
js中复制行和删除行的操作实例
Jun 25 Javascript
用jquery统计子菜单的条数示例代码
Oct 18 Javascript
深入领悟JavaScript中的面向对象
Nov 18 Javascript
一个JS函数搞定网页标题(title)闪动效果
May 13 Javascript
JavaScript从数组的indexOf()深入之Object的Property机制
May 11 Javascript
JS在Chrome浏览器中showModalDialog函数返回值为undefined的解决方法
Aug 03 Javascript
jQuery设置下拉框显示与隐藏效果的方法分析
Sep 15 jQuery
NProgress显示顶部进度条效果及使用详解
Sep 21 Javascript
微信小程序开发打开另一个小程序的实现方法
May 17 Javascript
vue的$http的get请求要加上params操作
Nov 12 Javascript
通过命令行创建vue项目的方法
Jul 20 #Javascript
基于BootStrap实现简洁注册界面
Jul 20 #Javascript
AngularJS实现的JSONP跨域访问数据传输功能详解
Jul 20 #Javascript
深入探究node之Transform
Jul 20 #Javascript
微信小程序“摇一摇”的实例代码
Jul 20 #Javascript
基于JavaScript实现微信抢红包功能
Jul 20 #Javascript
ReactNative短信验证码倒计时控件的实现代码
Jul 20 #Javascript
You might like
smarty的保留变量问题
2008/10/23 PHP
Yii2结合Workerman的websocket示例详解
2018/09/10 PHP
PHP开发API接口签名生成及验证操作示例
2020/05/27 PHP
javascript 一些用法小结
2009/09/11 Javascript
网页源代码保护(禁止右键、复制、另存为、查看源文件)
2012/05/23 Javascript
js离开或刷新页面检测(且兼容FF,IE,Chrome)
2014/03/05 Javascript
javascript每日必学之继承
2016/02/23 Javascript
Vue自定义指令详解
2017/07/28 Javascript
vue代码分割的实现(codesplit)
2018/11/13 Javascript
记一次vue去除#问题处理经过小结
2019/01/24 Javascript
用element的upload组件实现多图片上传和压缩的示例代码
2019/02/12 Javascript
详解如何使用微信小程序云函数发送短信验证码
2019/03/13 Javascript
Webpack4+Babel7+ES6兼容IE8的实现
2019/04/10 Javascript
Antd表格滚动 宽度自适应 不换行的实例
2020/10/27 Javascript
Python的Tornado框架实现图片上传及图片大小修改功能
2016/06/30 Python
Python 使用类写装饰器的小技巧
2018/09/30 Python
python retrying模块的使用方法详解
2019/09/25 Python
python ctypes库2_指定参数类型和返回类型详解
2019/11/19 Python
复化梯形求积分实例——用Python进行数值计算
2019/11/20 Python
Python Selenium参数配置方法解析
2020/01/19 Python
使用pymysql查询数据库,把结果保存为列表并获取指定元素下标实例
2020/05/15 Python
Pycharm生成可执行文件.exe的实现方法
2020/06/02 Python
Python变量格式化输出实现原理解析
2020/08/06 Python
input file上传文件样式支持html5的浏览器解决方案
2012/11/14 HTML / CSS
Kivari官网:在线购买波西米亚服装
2018/10/29 全球购物
Unix/Linux开发面试题
2016/08/16 面试题
自荐信怎么写好
2013/11/11 职场文书
门卫岗位职责
2013/11/15 职场文书
五一家具促销方案
2014/01/10 职场文书
酒店中秋节促销方案
2014/01/30 职场文书
村长贪污检举信
2014/04/04 职场文书
《欢乐的泼水节》教学反思
2014/04/22 职场文书
2015年维修工作总结
2015/04/25 职场文书
2015秋季新学期开学寄语
2015/05/28 职场文书
家庭贫困证明
2015/06/16 职场文书
macos系统如何实现微信双开? mac登录两个微信以上微信的技巧
2022/07/23 数码科技