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

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

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

 

第三部分 数据绑定

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

data-binding01

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

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

1
2
3
4
<div ng-controller= "MyController" >
   <input type= "text" ng-model= "person.name" placeholder= "Enter your name" />
   <h5>Hello {{ person.name }}</h5>
</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();});

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

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

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

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

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

试试看:

_4NF@PJ182[352{D2DOSZ7I

 

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值