深入探究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 相关文章推荐
jQuery中jqGrid分页实现代码
Nov 04 Javascript
jQuery Mobile的loading对话框显示/隐藏方法分享
Nov 26 Javascript
js 本地预览的简单实现方法
Feb 18 Javascript
jquery判断元素是否隐藏的多种方法
May 06 Javascript
Firefox下无法正常显示年份的解决方法
Sep 04 Javascript
jQuery中click事件的定义和用法
Dec 20 Javascript
基于jQuery和CSS3制作数字时钟附源码下载(jquery篇)
Nov 24 Javascript
javascript中FOREACH数组方法使用示例
Mar 01 Javascript
JQuery 动态生成Table表格实例代码
Dec 02 Javascript
VsCode新建VueJs项目的详细步骤
Sep 23 Javascript
搭建一个Koa后端项目脚手架的方法步骤
May 30 Javascript
Vue.js实现立体计算器
Feb 22 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
PHP轻量级数据库操作类Medoo增加、删除、修改、查询例子
2014/07/04 PHP
PHP实现对文本数据库的常用操作方法实例演示
2014/07/04 PHP
php实现parent调用父类的构造方法与被覆写的方法
2015/02/11 PHP
PHP入门教程之上传文件实例详解
2016/09/11 PHP
PHP 爬取网页的主要方法
2018/07/13 PHP
在PHP中实现使用Guzzle执行POST和GET请求
2019/10/15 PHP
JavaScript 快捷键设置实现代码
2009/03/13 Javascript
Javascript 获取字符串字节数的多种方法
2009/06/02 Javascript
Js日期选择器并自动加入到输入框中示例代码
2013/08/02 Javascript
JavaScript实现将UPC转换成ISBN的方法
2015/05/26 Javascript
jquery siblings获取同辈元素用法实例分析
2016/07/25 Javascript
jquery 多个radio的click事件实例
2016/12/03 Javascript
JavaScript限制在客户区可见范围的拖拽(解决scrollLeft和scrollTop的问题)(2)
2017/05/17 Javascript
javaScript手机号码校验工具类PhoneUtils详解
2017/12/08 Javascript
vue登录注册及token验证实现代码
2017/12/14 Javascript
AngularJS select加载数据选中默认值的方法
2018/02/28 Javascript
浅谈react性能优化的方法
2018/09/05 Javascript
关于node-bindings无法在Electron中使用的解决办法
2018/12/18 Javascript
使用Vue.js 和Chart.js制作绚丽多彩的图表
2019/06/15 Javascript
ES5和ES6中类的区别总结
2020/12/21 Javascript
[00:32]DOTA2上海特级锦标赛 Ehome战队宣传片
2016/03/03 DOTA
python处理json数据中的中文
2014/03/06 Python
Python中关于字符串对象的一些基础知识
2015/04/08 Python
详解Django框架中的视图级缓存
2015/07/23 Python
python使用matplotlib绘图时图例显示问题的解决
2017/04/27 Python
python使用os.listdir和os.walk获得文件的路径的方法
2017/12/16 Python
终端命令查看TensorFlow版本号及路径的方法
2018/06/13 Python
Django之模型层多表操作的实现
2019/01/08 Python
浅谈python新式类和旧式类区别
2019/04/26 Python
打包python 加icon 去掉cmd黑窗口方法
2019/06/24 Python
浅谈PyTorch的可重复性问题(如何使实验结果可复现)
2020/02/20 Python
让IE下支持Html5的placeholder属性的插件
2014/09/02 HTML / CSS
捷克领先的户外服装及配件市场零售商:ALPINE PRO
2018/01/09 全球购物
党支部2014年度工作总结
2014/12/04 职场文书
学校后勤工作总结2015
2015/05/15 职场文书
JavaScript小技巧带你提升你的代码技能
2021/09/15 Javascript