文档章节

七步从Angular.JS菜鸟到专家(3):数据绑定和AJAX(1)

liuyuantao
 liuyuantao
发布于 2016/04/09 09:53
字数 2085
阅读 3
收藏 0


这是"AngularJS - 七步从菜鸟到专家"系列的第三篇。

在第一篇,我们展示了如何开始搭建一个AngularaJS应用。第二篇我们讨论了scope和 $scope 的功能。

通过这整个系列的教程,我们会开发一个NPR(美国全国公共广播电台)广播的音频播放器,它能显示Morning Edition节目里现在播出的最新故事,并在我们的浏览器里播放。完成版的Demo可以看这里。

第三部分 数据绑定

通过把一个文本输入框绑定到person.name属性上,就能把我们的应用变得更有趣一点。这一步建立起了文本输入框跟页面的双向绑定。

data-binding01

在这个语境里“双向”意味着如果view变了属性值,model就会“看到”这个改变,而如果model变了属性值,view也同样会“看到”这个改变。Angular.js 为你自动搭建好了这个机制。如果你好奇这具体是怎么实现的,请看我们之后推出的一篇文章,其中深入讨论了digest_loop 的运作。

要建立这个绑定,我们在文本输入框上使用ng-model 指令属性,像这样:


  
  1. <div ng-controller="MyController"> 
  2.   <input type="text" ng-model="person.name" placeholder="Enter your name" /> 
  3.   <h5>Hello {{ person.name }}</h5> 
  4. </div> 

现在我们建立好了一个数据绑定(没错,就这么容易),来看看view么改变model吧:

试试看:

]$ZBZ}{QE)E)ZH[R1TQHJ)R

当你在文本框里输入时,下面的名字也自动随之改变,这就展现了我们数据绑定的一个方向:从viewmodel我们也可以在我们的(客户端)后台改变model,看这个改变自动在前端体现出来。要展示这一过程,让我们在  MyController 的model里写一个计时器函数, 更新 $scope 上的一个数据。下面的代码里,我们就来创建这个计时器函数,它会在每秒计时(像钟表那样),并更新 $scope 上的clock变量数据:


  
  1. app.controller('MyController', function($scope) {  $scope.person = { name: "Ari Lerner" };  var updateClock = function() {    $scope.clock = new Date();  };  var timer = setInterval(function() {    $scope.$apply(updateClock);  }, 1000);  updateClock();}); 

可以看到,当我们改变modelclock变量的数据,view会自动更新来反映此变化。用大括号我们就可以很简单地让clock变量的值显示在view里:


  
  1. <div ng-controller="MyController"> 
  2.   <h5>{{ clock }}</h5> 
  3. </div> 

请看:

{{ clock }}

互动

前面我们把数据绑定在了文本输入框上。请注意, 数据绑定并非只限于数据,我们还可以利用绑定调用 $scope 中的函数(这一点之前已经提到过)。

对按钮、链接或任何其他的DOM元素,我们都可以用另一个指令属性来实现绑定:ng-click 。这个 ng-click 指令将DOM元素的鼠标点击事件(即 mousedown 浏览器事件)绑定到一个方法上,当浏览器在该DOM元素上鼠标触发点击事件时,此被绑定的方法就被调用。跟上一个例子相似,这个绑定的代码如下:


  
  1. <div ng-controller="DemoController"> 
  2.   <h4>The simplest adding machine ever</h4> 
  3.   <button ng-click="add(1)" class="button">Add</button> 
  4.   <button ng-click="subtract(1)" class="button">Subtract</button> 
  5.   <h4>Current count: {{ counter }}</h4> 
  6. </div> 

不论是按钮还是链接都会被绑定到包含它们的DOM元素的controller所有的 $scope 对象上,当它们被鼠标点击,Angular就会调用相应的方法。注意当我们告诉Angular调用什么方法时,我们将方法名写进带引号的字符串里。


  
  1. app.controller('DemoController', function($scope) { 
  2.   $scope.counter = 0
  3.   $scope.add = function(amount) { $scope.counter += amount; }; 
  4.   $scope.subtract = function(amount) { $scope.counter -amount; }; 
  5. }); 

 请看:

RE`$1}{MZI)QSO`84SZF$UA

myApp中的数据绑定和AJAX

互动

在上一篇的例子中,我们对view的一个按钮进行了刚才学到的数据绑定,给play钮绑定了 PlayerController 的play方法(同样的,还给stop钮绑定了stop方法)。

AJAX

在上一篇教程里,我们引用的是一个存储在本地的音频文件,它给我们的是一个静态的NPR文件,而不是一个动态的NPR feed。在我们的NPR应用里,我们将用$http 来填充我们可播放的新闻文件的列表。Angular.js原生支持AJAX,由此我们就获得了与一个或多个服务器来回发送请求的能力。这个能力对我们要创建的这种客户端应用来说是至关重要的,因为这种应用需要跟服务器交流,获取和更新数据。Angular.js过一个服务来支持AJAX(在之后的章节我们会讨论这个服务),这个服务就叫做 $http 服务。所有Angular.js的核心服务都用 $ 前缀,这点在之前的 $scope  服务里我们已经见过了。这个 $http 服务极其灵活,给了我们很多种方式来调用AJAX务。为保证本教程简单易懂,我们专注于最简单的方式。在以后更高级的章节里我们会深入介绍 $http 服务。在深入过多细节之前,让我们先来用 $http 服务创建一个请求:


  
  1. $http({  method: 'JSONP',  url: 'http://api.openbeerdatabase.com/v1/beers.json?callback=JSON_CALLBACK'}).success(function(data, status, headers, config) {  // data contains the response  // status is the HTTP status  // headers is the header getter function  // config is the object that was used to create the HTTP request}).error(function(data, status, headers, config) {}); 

试试看:

)QFA8YRE[YBEDEHIUEBVHTX

$http 服务是Angular.js的核心服务之一,它帮助我们通过XMLHttpRequest对象或JSONP远程HTTP务进行交流。

注意, 像上面例子中那样,原封不动加上以下字符串 callback=JSON_CALLBACK ,Angular.js就会负责为你处理JSONP请求,将 JSON_CALLBACK 替换成一个合适的回调函数。

$http 服务是这样一个函数:它接受一个设置对象,其中指定了如何创建HTTP请求;它将返回一个承诺(*参考JavaScript步编程的promise模式),其中提供两个方法: success方法和error方法。

要取得可播放的音频文件列表,让我们向NPRAPI发送一个请求。首先,你需要倒NPR注册以取得一个API key。到它们的网站 http://www.npr.org/templates/reg/ 去。(作者在这里用Angular.js做了一个用iFrame载的NPR注册表单,见下图,或者直接前往英文原文查看)。

记下你的API key,我们马上就会用到它。现在我们要设置我们的PlayController 调用 $http 服务,取回音频文件。

像我们刚才做的那样,让我们调用 $http 服务来创建一个请求,这一次是为了取得所有音频文件。我们想让这个服务在controller实例化时启动,所以我们只需要把这个方法直接放在controller函数里(这个函数在controller创建时就会被调用),像这样:


  
  1. var apiKey = 'YOUR_KEY'
  2.     nprUrl = 'http://api.npr.org/query?id=61&fields=relatedLink,title,byline,text,audio,image,pullQuote,all&output=JSON'
  3.   
  4. app.controller('PlayerController', function($scope, $http) { 
  5.   // Hidden our previous section's content 
  6.   // construct our http request 
  7.   $http({ 
  8.     method: 'JSONP', 
  9.     url: nprUrl + '&apiKey=' + apiKey + '&callback=JSON_CALLBACK
  10.   }).success(function(data, status) { 
  11.     // Now we have a list of the stories (data.list.story) 
  12.     // in the data object that the NPR API 
  13.     // returns in JSON that looks like: 
  14.     // data: { "list": { 
  15.     //   "title": ... 
  16.     //   "story": [ 
  17.     //     { "id": ... 
  18.     //       "title": ... 
  19.   }).error(function(data, status) { 
  20.     // Some error occurred 
  21.   }); 
  22. }); 

现在我们在success函数的data里有了一个音频文件的列表。在success调函数里,把这个列表存储在 $scope 对象,这样我们就简单地把它绑定在了 $scope 对象上:


  
  1. // from above 
  2. }).success(function(data, status) { 
  3.   // Store the list of stories on the scope 
  4.   // from the NPR API response object (described above) 
  5.   $scope.programs = data.list.story; 
  6. }).error(function(data, status) { 
  7.   // Some error occurred 

现在,跟刚才一样, 只需在view访问programs,我们就能在view访问这个data。你看,使用Angular.js的一个好处就是,当承诺模式返回成功结果时,Angular.js就会自动把这个结果填进你的view里。


  
  1. <div ng-controller="PlayerController"> 
  2. {{ programs }} 
  3. </div> 

试试看:

_4NF@PJ182[352{D2DOSZ7I

在下一章里,我们会讨论怎么在我们的view里有意义地展示这个data对象,使用一些Angular.js带的指令(和更多的一点什么)。

本系列的官方代码库可从github上下载:

https://github.com/auser/ng-newsletter-beginner-series.

要将这个代码库保存到本地,请先确保安装了gitclone此代码库,然后check out其中的part3分支:


  
  1. git clone https://github.com/auser/ng-newsletter-beginner-series.git 
  2. git checkout -b part3 

原文链接:http://www.ng-newsletter.com/posts/beginner2expert-data-binding.html

译文链接:http://blog.jobbole.com/48780/

本文转载自:http://blog.csdn.net/u013510614/article/details/38641119

liuyuantao
粉丝 5
博文 134
码字总数 27666
作品 0
武汉
高级程序员
私信 提问
学习 AngularJS (一)

进一步看入 kityminder-editor 部分了, 打开示例文件 index.html, 开头就是引入三个著名 js 开源库: jQuery.js, bootstrap.js, angular.js 这意味着我又得学习了解这些库都是干什么的了. 略知...

刘军兴
2015/12/04
235
0
【前端】—聊聊我认识的Angular

前言 最近接触的项目前端用到了Angular框架,之前略有耳闻,从vue换到Angular,感觉东西差不多,还是要系统学习的,先来了解下。 正文 1、Angular 的发展 AngularJS 是一款来自Google的前端J...

zt15732625878
2018/05/19
0
0
第214天:Angular 基础概念

一、Angular 简介 1、 什么是 AngularJS - 一款非常优秀的前端高级 JS 框架 - 最早由 Misko Hevery 等人创建 - 2009 年被 Google 公式收购,用于其多款产品 - 目前有一个全职的开发团队继续开...

半指温柔乐
2018/04/04
0
0
AngularJS 提交表单的方式

在AngularJS出现之前,很多开发者就面对了表单提交这一问题。由于提交表单的方式繁杂而不同,很容易令人疯掉……然而现在看来,依然会让人疯掉。 今天,我们会看一下过去使用PHP方式提交的表...

oschina
2014/06/21
60.8K
18
关于AngularJs与JQuery的区别

关于AngularJs和JQuery之间的区别嘛,这篇文章说的很清楚了,我就不多说了:英文原版 中文版 这里谈谈我的一些看法: JQuery是一个工具库,它并不是框架。 当然你会说JQuery UI、Bootstrap等...

Raphael_goh
2014/12/14
9
1

没有更多内容

加载失败,请刷新页面

加载更多

JS基础-该如何理解原型、原型链?

JS的原型、原型链一直是比较难理解的内容,不少初学者甚至有一定经验的老鸟都不一定能完全说清楚,更多的"很可能"是一知半解,而这部分内容又是JS的核心内容,想要技术进阶的话肯定不能对这个...

OBKoro1
今天
6
0
高防CDN的出现是为了解决网站的哪些问题?

高防CDN是为了更好的服务网络而出现的,是通过高防DNS来实现的。高防CDN是通过智能化的系统判断来路,再反馈给用户,可以减轻用户使用过程的复杂程度。通过智能DNS解析,能让网站访问者连接到...

云漫网络Ruan
今天
14
0
OSChina 周一乱弹 —— 熟悉的味道,难道这就是恋爱的感觉

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @xiaoshiyue :好久没分享歌了分享张碧晨的单曲《今后我与自己流浪》 《今后我与自己流浪》- 张碧晨 手机党少年们想听歌,请使劲儿戳(这里)...

小小编辑
今天
2.7K
24
SpringBoot中 集成 redisTemplate 对 Redis 的操作(二)

SpringBoot中 集成 redisTemplate 对 Redis 的操作(二) List 类型的操作 1、 向列表左侧添加数据 Long leftPush = redisTemplate.opsForList().leftPush("name", name); 2、 向列表右......

TcWong
今天
46
0
排序––快速排序(二)

根据排序––快速排序(一)的描述,现准备写一个快速排序的主体框架: 1、首先需要设置一个枢轴元素即setPivot(int i); 2、然后需要与枢轴元素进行比较即int comparePivot(int j); 3、最后...

FAT_mt
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部