详解angularjs 学习之 scope作用域


Posted in Javascript onJanuary 15, 2018

简介

Scope(作用域) 是应用在 HTML (视图) 和 JavaScript (控制器)之间的纽带。

Scope 是一个存储应用数据模型的对象,有可用的方法和属性。

Scope 可应用在视图和控制器上。

作用域是Web应用的控制器和视图之间的粘结剂:

控制器 --> 作用域 --> 视图(DOM)
指令 --> 作用域 --> 视图(DOM)

当你在 AngularJS 创建控制器时,你可以将 $scope 对象当作一个参数传递:

<div ng-controller="myCtrl">
<h1>{{name}}</h1>
</div>

<script>
var app = angular.module('test', []);
app.controller('myCtrl', function($scope) {
  $scope.name = "天下行走";
});
</script>

输出结果: 天下行走

控制器中创建一个属性名 "name" ,对应了视图中使用 {{ }} 中的名称。

当在控制器中添加 $scope 对象时,视图 (HTML) 可以获取了这些属性。

视图中,你不需要添加 $scope 前缀, 只需要添加属性名即可,如: {{name}} 。

AngularJS 应用组成如下:

View(视图) , 即 HTML。

Model(模型) , 当前视图中可用的数据。

Controller(控制器) , 即 JavaScript 函数,可以添加或修改属性。

scope 是一个 JavaScript 对象,带有 属性 和 方法 ,这些属性和方法可以在视图和控制器中使用。

再来看个例子:

<div ng-app="myApp" ng-controller="myCtrl">
  输入你的名字:
  <input ng-model="name">
  <h1>{{greeting}}</h1>
  <button ng-click='sayHello()'>greet</button>  
</div>

<script>
var app = angular.module('myApp', []);
app.controller('myCtrl', function($scope) {
  $scope.name = "张三";
  $scope.sayHello = function() {
    $scope.greeting = $scope.name + '是个笨蛋!';
  };
});
</script>

在这个例子中,

  1. 控制器: MyCtrl ,它引用了 $scope 并在其上注册了两个属性和一个方法
  2. $scope 对象:持有上面例子所需的数据模型,包括 name 属性、 greeting 属性 (注:这是在 sayHello() 方法被调用时注册的) 和 sayHello() 方法
  3. 视图:拥有一个输入框、一个按钮以及一个利用双向绑定来显示数据的内容块

那么具体整个示例有这样两个流程,从控制器发起的角度来看就是:

1、控制器往作用域中写属性:

给作用域中的 name 赋值,然后作用域通知视图中的 input 数据变化了, input 因为通过 ng-model 实现了双向绑定可以知道 name 的变化,进而在视图中渲染出改变的值

2、控制器往作用域中写方法

给作用域中的 sayHello() 方法赋值,该方法被视图中的 button 调用,因为 button 通过 ng-click 绑定了该方法,当用户点击按钮时, sayHello() 被调用,这个方法读取作用域中的 name 属性,加上后缀字符串,然后赋值给在作用域中新创建的 greeting 属性

整个示例的过程如果从视图的角度看,那主要是以下三个部分:

1、input 中的渲染逻辑:展示了通过 ng-model 进行的作用域和 视图中某表单元素的双向绑定

  1. 根据 ng-model 中的 name 去作用域中取,如果已经有值,那么用这个默认值填充当前的输入框
  2. 接受用户输入,并且将用户输入的字符串传给 name ,这时候作用域中的该属性值实时更新为用户输入的值

2、button 中的逻辑

接受用户单击,调用作用域中的 sayHello() 方法

3、{{greeting}} 的渲染逻辑

  1. 初始阶段 :在用户未单击按钮时,不显示内容
  2. 取值阶段 :在用户单击后,这个表达式会去 scope 中取 greeting 属性,而本例中这个作用域和控制器是同一个的,这时候,该作用域下 greeting 属性已经有了,这时候这个属性就被取回来了
  3. 计算阶段 :在当前作用域下去计算 greeting 表达式,然后渲染视图,显示 张三是个笨蛋!

经过以上的两种角度分析示例过程,我们可以知道: 作用域(scope) 对象以及其属性是视图渲染的唯一数据来源。

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

Javascript 相关文章推荐
firefox下对ajax的onreadystatechange的支持情况分析
Dec 14 Javascript
微信JS接口汇总及使用详解
Jan 09 Javascript
js实现图片放大和拖拽特效代码分享
Sep 05 Javascript
jQuery无刷新上传之uploadify3.1简单使用
Jun 18 Javascript
浅谈js图片前端预览之filereader和window.URL.createObjectURL
Jun 30 Javascript
Bootstrap实现弹性搜索框
Jul 11 Javascript
AngularJS 过滤器的简单实例
Jul 27 Javascript
微信小程序 wx.login解密出现乱码的问题解决办法
Mar 10 Javascript
利用node.js+mongodb如何搭建一个简单登录注册的功能详解
Jul 30 Javascript
用Vue.extend构建消息提示组件的方法实例
Aug 08 Javascript
基于vue如何发布一个npm包的方法步骤
May 15 Javascript
JQuery使用数组遍历跳出each循环
Sep 01 jQuery
高性能的javascript之加载顺序与执行原理篇
Jan 14 #Javascript
关于axios如何全局注册浅析
Jan 14 #Javascript
Vue+Flask实现简单的登录验证跳转的示例代码
Jan 13 #Javascript
react-redux中connect的装饰器用法@connect详解
Jan 13 #Javascript
基于vue实现网站前台的权限管理(前后端分离实践)
Jan 13 #Javascript
详解webpack-dev-server使用http-proxy解决跨域问题
Jan 13 #Javascript
vuejs实现递归树型菜单组件
Jan 13 #Javascript
You might like
安健A254立体声随身听的分析与打磨
2021/03/02 无线电
php GD绘制24小时柱状图
2008/06/28 PHP
PHP SPL标准库之数据结构堆(SplHeap)简单使用实例
2015/05/12 PHP
验证坐标在某坐标区域内php代码
2016/10/08 PHP
ThinkPHP整合datatables实现服务端分页的示例代码
2018/02/10 PHP
Javascript(AJAX)解析XML的代码(兼容FIREFOX/IE)
2010/07/11 Javascript
JavaScript中的this关键字介绍与使用实例
2013/06/21 Javascript
jQuery实用小技巧_输入框文字获取和失去焦点的简单实例
2016/08/25 Javascript
js无提示关闭浏览器窗口的两种方法分析
2016/11/06 Javascript
通过nodejs 服务器读取HTML文件渲染到页面的方法
2018/05/17 NodeJs
原生实现一个react-redux的代码示例
2018/06/08 Javascript
vue自定义tap指令及tap事件的实现
2018/09/18 Javascript
NodeJs实现简单的爬虫功能案例分析
2018/12/05 NodeJs
原生JS实现的放大镜特效示例【测试可用】
2018/12/08 Javascript
vue项目中使用fetch的实现方法
2019/04/25 Javascript
js利用递归与promise 按顺序请求数据的方法
2019/08/30 Javascript
JavaScript实现京东放大镜效果
2019/12/03 Javascript
详细分析Node.js 多进程
2020/06/22 Javascript
Node.js利用Express实现用户注册登陆功能(推荐)
2020/10/26 Javascript
Python利用Beautiful Soup模块修改内容方法示例
2017/03/27 Python
python简单线程和协程学习心得(分享)
2017/06/14 Python
深入理解Django的中间件middleware
2018/03/14 Python
Python+selenium实现自动循环扔QQ邮箱漂流瓶
2018/05/29 Python
pytorch中tensor的合并与截取方法
2018/07/26 Python
将keras的h5模型转换为tensorflow的pb模型操作
2020/05/25 Python
PIP和conda 更换国内安装源的方法步骤
2020/09/21 Python
海滩咖啡馆:Beach Cafe
2018/02/02 全球购物
Mansur Gavriel官网:纽约市的一个设计品牌
2019/05/02 全球购物
标记环网Toke Ring IEEE802.5
2014/05/26 面试题
MYSQL基础面试题
2012/05/13 面试题
车间工艺员岗位职责
2013/12/09 职场文书
你懂得怎么写自荐信吗?
2013/12/27 职场文书
党的群众路线教育实践活动个人对照检查材料(教师)
2014/11/04 职场文书
楚门的世界观后感
2015/06/03 职场文书
pytorch实现加载保存查看checkpoint文件
2022/07/15 Python
HTML5页面打开微信小程序功能实现
2022/09/23 HTML / CSS