这是"AngularJS - 七步从菜鸟到专家"系列的第三篇。html
在第一篇,咱们展现了如何开始搭建一个AngularaJS应用。第二篇咱们讨论了scope和 $scope 的功能。前端
经过这整个系列的教程,咱们会开发一个NPR(美国全国公共广播电台)广播的音频播放器,它能显示Morning Edition节目里如今播出的最新故事,并在咱们的浏览器里播放。完成版的Demo能够看这里。git
第三部分 数据绑定github
经过把一个文本输入框绑定到person.name属性上,就能把咱们的应用变得更有趣一点。这一步创建起了文本输入框跟页面的双向绑定。编程
在这个语境里“双向”意味着若是view改变了属性值,model就会“看到”这个改变,而若是model改变了属性值,view也一样会“看到”这个改变。Angular.js 为你自动搭建好了这个机制。若是你好奇这具体是怎么实现的,请看咱们以后推出的一篇文章,其中深刻讨论了digest_loop 的运做。json
要创建这个绑定,咱们在文本输入框上使用ng-model 指令属性,像这样:api
如今咱们创建好了一个数据绑定(没错,就这么容易),来看看view怎么改变model吧:promise
试试看:浏览器
当你在文本框里输入时,下面的名字也自动随之改变,这就展示了咱们数据绑定的一个方向:从view到model。咱们也能够在咱们的(客户端)后台改变model,看这个改变自动在前端体现出来。要展现这一过程,让咱们在 MyController 的model里写一个计时器函数, 更新 $scope 上的一个数据。下面的代码里,咱们就来建立这个计时器函数,它会在每秒计时(像钟表那样),并更新 $scope 上的clock变量数据:服务器
能够看到,当咱们改变modelclock变量的数据,view会自动更新来反映此变化。用大括号咱们就能够很简单地让clock变量的值显示在view里:
请看:
{{ clock }}
互动
前面咱们把数据绑定在了文本输入框上。请注意, 数据绑定并不是只限于数据,咱们还能够利用绑定调用 $scope 中的函数(这一点以前已经提到过)。
对按钮、连接或任何其余的DOM元素,咱们均可以用另外一个指令属性来实现绑定:ng-click 。这个 ng-click 指令将DOM元素的鼠标点击事件(即 mousedown 浏览器事件)绑定到一个方法上,当浏览器在该DOM元素上鼠标触发点击事件时,此被绑定的方法就被调用。跟上一个例子类似,这个绑定的代码以下:
不管是按钮仍是连接都会被绑定到包含它们的DOM元素的controller全部的 $scope 对象上,当它们被鼠标点击,Angular就会调用相应的方法。注意当咱们告诉Angular要调用什么方法时,咱们将方法名写进带引号的字符串里。
请看:
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 服务建立一个请求:
试试看:
$http 服务是Angular.js的核心服务之一,它帮助咱们经过XMLHttpRequest对象或JSONP与远程HTTP服务进行交流。
注意, 像上面例子中那样,原封不动加上如下字符串 callback=JSON_CALLBACK ,Angular.js就会负责为你处理JSONP请求,将 JSON_CALLBACK 替换成一个合适的回调函数。
$http 服务是这样一个函数:它接受一个设置对象,其中指定了如何建立HTTP请求;它将返回一个承诺(*参考JavaScript异步编程的promise模式),其中提供两个方法: success方法和error方法。
要取得可播放的音频文件列表,让咱们向NPR的API发送一个请求。首先,你须要倒NPR注册以取得一个API key。到它们的网站 http://www.npr.org/templates/reg/ 去。(做者在这里用Angular.js作了一个用iFrame加载的NPR注册表单,见下图,或者直接前往英文原文查看)。
记下你的API key,咱们立刻就会用到它。如今咱们要设置咱们的PlayController 来调用 $http 服务,取回音频文件。
像咱们刚才作的那样,让咱们调用 $http 服务来建立一个请求,这一次是为了取得全部音频文件。咱们想让这个服务在controller实例化时启动,因此咱们只须要把这个方法直接放在controller函数里(这个函数在controller被建立时就会被调用),像这样:
如今咱们在success函数的data里有了一个音频文件的列表。在success回调函数里,把这个列表存储在 $scope 对象,这样咱们就简单地把它绑定在了 $scope 对象上:
如今,跟刚才同样, 只需在view里访问programs,咱们就能在view里访问这个data。你看,使用Angular.js的一个好处就是,当承诺模式返回成功结果时,Angular.js就会自动把这个结果填进你的view里。
试试看:
在下一章里,咱们会讨论怎么在咱们的view里有意义地展现这个data对象,使用一些Angular.js自带的指令(和更多的一点什么)。
本系列的官方代码库可从github上下载:
https://github.com/auser/ng-newsletter-beginner-series.
要将这个代码库保存到本地,请先确保安装了git,clone此代码库,而后check out其中的part3分支:
原文连接:http://www.ng-newsletter.com/posts/beginner2expert-data-binding.html