深入探究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 相关文章推荐
[全兼容哦]--实用、简洁、炫酷的页面转入效果loing
May 07 Javascript
分享27款非常棒的jQuery 表单插件
Mar 28 Javascript
js实现addClass,removeClass,hasClass的函数代码
Jul 13 Javascript
javascript日期对象格式化为字符串的实现方法
Jan 14 Javascript
JS完整获取IE浏览器信息包括类型、版本、语言等等
May 22 Javascript
如何使用jquery easyui创建标签组件
Nov 18 Javascript
设置点击文本框或图片弹出日历控件的实现代码
May 12 Javascript
JS实现根据用户输入分钟进行倒计时功能
Nov 14 Javascript
JavaScript实现鼠标点击导航栏变色特效
Feb 08 Javascript
vue中component组件的props使用详解
Sep 04 Javascript
微信小程序传值以及获取值方法的详解
Apr 29 Javascript
vue 自定义组件的写法与用法详解
Mar 04 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出错界面
2006/10/09 PHP
PHP 字符截取 解决中文的截取问题,不用mb系列
2009/09/29 PHP
利用浏览器的Javascript控制台调试PHP程序
2014/01/08 PHP
Thinkphp实现自动验证和自动完成
2015/12/19 PHP
PHP中file_exists使用中遇到的问题小结
2016/04/05 PHP
PHP XML Expat解析器知识点总结
2019/02/15 PHP
几种设置表单元素中文本输入框不可编辑的方法总结
2013/11/25 Javascript
jqeury-easyui-layout问题解决方法
2014/03/24 Javascript
JavaScript中的setMilliseconds()方法使用详解
2015/06/11 Javascript
极易被忽视的javascript面试题七问七答
2016/02/15 Javascript
Jq通过td获取同行其它列td的方法
2016/10/05 Javascript
利用Bootstrap实现表格复选框checkbox全选
2016/12/21 Javascript
easyUI实现类似搜索框关键词自动提示功能示例代码
2016/12/27 Javascript
vue实现在表格里,取每行的id的方法
2018/03/09 Javascript
微信小程序实现富文本图片宽度自适应的方法
2019/01/20 Javascript
JS数据类型判断的几种常用方法
2020/07/07 Javascript
如何在Vue项目中添加接口监听遮罩
2021/01/25 Vue.js
二种python发送邮件实例讲解(python发邮件附件可以使用email模块实现)
2013/12/03 Python
python获取当前计算机cpu数量的方法
2015/04/18 Python
Python3实现简单可学习的手写体识别(实例讲解)
2017/10/21 Python
python中的迭代和可迭代对象代码示例
2017/12/27 Python
利用Python代码实现数据可视化的5种方法详解
2018/03/25 Python
分享vim python缩进等一些配置
2018/07/02 Python
用Python中的turtle模块画图两只小羊方法
2019/04/09 Python
python求解汉诺塔游戏
2020/07/09 Python
django form和field具体方法和属性说明
2020/07/09 Python
如何用python开发Zeroc Ice应用
2021/01/29 Python
惠而浦美国官网:Whirlpool.com
2021/01/19 全球购物
教师业务学习制度
2014/01/25 职场文书
《乡下孩子》教学反思
2014/04/17 职场文书
共筑中国梦演讲稿
2014/04/23 职场文书
革命英雄事迹演讲稿
2014/09/13 职场文书
党支部反对四风思想汇报
2014/10/10 职场文书
幼儿园母亲节活动总结
2015/02/10 职场文书
python中的class_static的@classmethod的巧妙用法
2021/06/22 Python
springboot新建项目pom.xml文件第一行报错的解决
2022/01/18 Java/Android