深入探究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 相关文章推荐
setAttribute 与 class冲突解决
Feb 17 Javascript
一个cssQuery对象 javascript脚本实现代码
Jul 21 Javascript
JS事件在IE与FF中的区别详细解析
Nov 20 Javascript
使用jQuery UI库开发Web界面的简单入门指引
Apr 22 Javascript
利用JS屏蔽页面中的Enter按键提交表单的方法
Nov 25 Javascript
ajax的分页查询示例(不刷新页面)
Jan 11 Javascript
网页中右键功能的实现方法之contextMenu的使用
Feb 20 Javascript
Vue.js中extend选项和delimiters选项的比较
Jul 17 Javascript
iview在vue-cli3如何按需加载的方法
Oct 31 Javascript
vue自定义正在加载动画的例子
Nov 14 Javascript
Vue使用自定义指令实现拖拽行为实例分析
Jun 06 Javascript
Javascript文本框脚本实现方法解析
Oct 30 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
《星际争霸》各版本雷兽特点图文解析 雷兽不同形态一览
2020/03/02 星际争霸
PHP配置心得包含MYSQL5乱码解决
2006/11/20 PHP
PHP 导出数据到淘宝助手CSV的方法分享
2010/02/27 PHP
PHP获取搜索引擎关键字来源的函数(支持百度和谷歌等搜索引擎)
2012/10/03 PHP
PHP Warning: Module 'modulename' already loaded in问题解决办法
2015/03/16 PHP
js DataSet数据源处理代码
2010/03/29 Javascript
jquery.AutoComplete.js中文修正版(支持firefox)
2010/04/09 Javascript
JavaScript中函数声明优先于变量声明的实例分析
2012/03/01 Javascript
选择器中含有空格在使用示例及注意事项
2013/07/31 Javascript
javascript实现浏览器窗口传递参数的方法
2014/09/03 Javascript
JavaScript用select实现日期控件
2015/07/17 Javascript
JS动态给对象添加事件的简单方法
2016/07/19 Javascript
jQuery实现自动输入email、时间和域名的方法
2016/08/24 Javascript
详解js中Number()、parseInt()和parseFloat()的区别
2016/12/20 Javascript
javascript添加前置0(补零)的几种方法
2017/01/05 Javascript
Nodejs 复制文件/文件夹的方法
2017/08/24 NodeJs
Vue中android4.4不兼容问题的解决方法
2018/09/04 Javascript
小程序实现层叠卡片滑动效果
2019/08/26 Javascript
详解javascript中var与ES6规范中let、const区别与用法
2020/01/11 Javascript
ReactRouter的实现方法
2021/01/25 Javascript
[01:19:35]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#2Fnatic VS OG第二局
2016/03/05 DOTA
python实现跨文件全局变量的方法
2014/07/07 Python
python静态方法实例
2015/01/14 Python
Python的for和break循环结构中使用else语句的技巧
2016/05/24 Python
Python3.4实现从HTTP代理网站批量获取代理并筛选的方法示例
2017/09/26 Python
Python爬虫实战之12306抢票开源
2019/01/24 Python
下载官网python并安装的步骤详解
2019/10/12 Python
python 弧度与角度互转实例
2020/04/15 Python
css3图片边框border-image的用法
2017/06/30 HTML / CSS
HTML5如何使用SVG的方法示例
2019/01/11 HTML / CSS
英国在线滑雪板和冲浪商店:The Board Basement
2020/01/11 全球购物
工商管理本科毕业生求职信范文
2013/10/05 职场文书
初中信息技术教学计划
2015/01/22 职场文书
2016年国庆节假期旅游工作总结
2016/04/01 职场文书
php 文件上传至OSS及删除远程阿里云OSS文件
2021/07/04 PHP
git stash(储藏)的用法总结
2022/06/25 Servers