本篇使用AngularJS实现订阅某个API服务。

首页大致是:

其中,what's on显示首页内容,Search通过输入关键词调用API服务显示到页面,MyShows显示订阅的内容。

Sarch页界面如下:

通过在搜索框中输入关键词,把查询到信息显示在当前页面,并且可以点击订阅和取消订阅按钮。

My Shows页界面如下:

显示订阅的内容,并且提供取消订阅按钮。

首先,需要了解API提供方所要求的格式。大致是:http://api.themoviedb.org/3/search/tv?api_key=87de9079e74c828116acce677f6f255b&query=Star%20Trek

文件结构:

node_modules/ [通过node下载的module存放于此]
sections/
.....my-shows/
..........my-shows.ctrl.js
..........my-shows.tpl.html
.....search/
..........search.css
..........search.ctrl.js
..........search.tpl.html
.....show/
..........show.ctrl.js
..........show.tpl.html
.....whats-on/
..........whats-on.ctrl.js
..........whats-on.tpl.html
services/
.....show.fct.js [search页需要的查询服务封装在这里]
.....store.fct.js [search需要的操作服务封装在这里]
app.core.js
app.js
app.routes.js [设置路由]
app.services.js
index.html

各个module之间的关系是重中之重,如下:

通过node需要安装的module命令如下:

npm install bootstrap
npm install angular
npm install angular-route
npm install angular-animate
npm i angular-local-storage

index.html

<a href="#/">What's on</a>
<a href="#/my-shows">My Shows</a>
<a href="#/search">Search</a> <main ng-view=""></main> <!--js引用-->
angular.min.js
angular-route.min.js
angular-animate.min.js
angular-local-storage.min.js
ui-bootstrap-tpls-0.12.1.min.js app.js
app.core.js
app.routes.js
app.services.js <!--SERVICES-->
show.fct.js
store.fct.js <!--CONTROLLERS-->
my-shows.ctrl.js
search.ctrl.js
show.ctrl.js
whats-on.ctrl.js

app.routes.js

在这里设置路由。

angular.module('app.routes',['ngRoute'])
.config(routes); function routes($routeProvider){
$routeProvider
.when('/',{
templateUrl: 'sections/whats-on/whats-on.tpl.html',
controller:'WhatsOnController',
controllerAs: 'whatsOn'
})
.when('/my-shows',{
templateUrl: 'sections/my-shows/my-shows.tpl.html',
controller: 'MyShowsController',
controllerAs: 'myShows'
})
.when('/search',{
templateUrl: 'sections/search/search.tpl.html',
controller: 'SearchController',
controllerAs: 'search'
})
.when('/show/:id',{
templateUrl: 'sections/show/show.tpl.html',
controller: 'ShowController',
controllerAs: 'show'
})
.otherwise({
redirectTo: '/'
});
}

show.fct.js

在这里,通过factory的方式返回一个对象,该对象包含查询的方法。

angular
.module('app.services')
.constant('API_KEY', '87de9079e74c828116acce677f6f255b')
.constant('BASE_URL', 'http://api.themoviedb.org/3')
.factory('ShowService', dataService); function dataService($http, API_KEY, BASE_URL, $log) {
var data = {
'get': get, //使用的时候不带参数
'search': search
}; //经$http返回的是一个promise
function makeRequest(url, params) {
var requestUrl = BASE_URL + '/' + url + '?api_key=' + API_KEY; //遍历查询参数
angular.forEach(params, function (value, key) {
requestUrl = requestUrl + '&' + key + '=' + value;
}); //发出请求
//$http接受一个对象也是第一次见
return $http({
'url': requestUrl,
'method': 'GET',
'headers': {
'Content-Type': 'application/json'
},
'cache': true
}).then(function (response) {
return response.data;
}).catch(dataServiceError);//旦凡一个函数作为令一个函数的实参,这两个函数的参赛也进行了传递
} //定义的时候带参数
function get(id) {
return makeRequest('tv/' + id, {});
} //查询
function search(query){
return makeRequest("search/tv",{query:query}).then(function(data){
return data.results;
});
} function dataServiceError(errorResponse) {
$log.error('XHR Failed for ShowService');
$log.error(errorResponse);
return errorResponse;
} //factory返回的就是一个对象
return data;
}

以上,在makeRequest方法中,不仅可以对url进行拼接,还对查询字符串(以对象的形式)进行了拼接。发出请求返回的是promise,即在调用的时候还可以使用then方法。

store.fct.js

这里封装了订阅和取消订阅的操作。

angular
.module('app.services')
.factory('StoreFactory', dataService); function dataService(localStorageService){
var _shows = []; var ls = localStorageService.get('store');
if(ls !== null){
_shows = ls;
} var service = {
'addShow':addShow,
'getShow':getShow,
'getShows':getShows,
'removeShow':removeShow
}; //订阅
function addShow(data){
_shows.push(data);
save();
} function getShow(id){
var result=false;
angular.forEach(_shows, function(show){
if(result===false){
if(show.id===id){
result = show;
}
}
});
return result;
} function getShows(){
return _shows;
} //取消订阅
function removeShow(id){
var idx=-1;
var found=false; angular.forEach(_shows, function(show){
if(found === false){
if(show.id === id){
found=true;
}
idx++;
}
}); if(found === true){
_shows.splice(idx, 1);
save();
}
} //保存到本地
function save(){
localStorageService.set('store',_shows);
} return service;
}

所以,所谓的订阅就是把获取到的数据保存在某个地方,取消订阅就是把数据从某个地方删除。

search.ctrl.js

angular.module('app.core').controller('SearchController', function (ShowService, $timeout, StoreFactory) {
var vm = this;
vm.results = false;
vm.searching = false; vm.query = function (query) {
vm.searching = true;
ShowService.search(query).then(function (response) {
vm.results = response; $timeout(function(){
vm.searching = false;
},500);
}).catch(function (error) { });
}; //订阅
vm.trackShow=function(show){
StoreFactory.addShow(show);
} //取消订阅
vm.unTrackShow = function(id){
StoreFactory.removeShow(id);
} //根据id搜索本地的store,存在就返回true, 不存在就返回false
vm.hasShow = function(id){
return (StoreFactory.getShow(id) !== false);
} });

search.tpl.html

<input type="text" name="query" ng-model="query"/>
<p ng-show="search.searching">Perfoming search...</p>
<button ng-click="search.query(query)">Search</button> <ul>
<li ng-repeat="show in search.results track by show.id">
...
<div ng-switch="search.hasShow(show.id)">
...
<button ng-switch-when="false" ng-click="search.trackShow(show)">Track Show</button>
<button ng-switch-when="true" ng-click="search.unTrackShow(show.id)">UnTrack Show</button>
</div>
</li>
<li class="no-data" ng-if="search.results === false">Find shows to track by using the search bar above.</li>
<li class="no-data" ng-if="search.results.length == 0">Your search did not return any results, try again.</li>
</ul>

以上,本地存在就显示UnTrack Show按钮,本地不存在就显示Track Show按钮。

AngularJS订阅API服务的更多相关文章

  1. 构建Web API服务

    返回总目录<一步一步使用ABP框架搭建正式项目系列教程> 构建动态Web API控制器 ABP可以自动地为应用层生成Web API 层.比如说我们之前创建的应用层: namespace N ...

  2. AngularJs + Web API 页面开发(一)

    AngularJS这个JS框架是个神马东东我也不太清楚,我也是初学者~~ AngularJS适用于single page App,单页面程序都是局部刷新的,这一点和Ajax有第一的区别,因为使用Aja ...

  3. 让AngularJS的$http 服务像jQuery.ajax()一样工作

    让AngularJS的$http 服务像jQuery.ajax()一样工作 $http的post . 请求默认的content-Type=application/json . 提交的是json对象的字 ...

  4. AngularJS 的异步服务测试与Mocking

    测试 AngularJS 的异步服务 最近,在做项目时掉进了 AngularJS 异步调用 $q 测试的坑中,直接躺枪了.折腾了许久日子,终于想通了其中的道道,但并不确定是最佳的解决方案,最后还是决定 ...

  5. 【9】JMicro微服务-发布订阅消息服务

    如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl 1. JMicro消息服务目前实现特性 a. JMicro只支持发布订阅消息服务,不支持队列式消息服务: b. 不支持消息持 ...

  6. Spring Cloud Zuul API服务网关之请求路由

    目录 一.Zuul 介绍 二.构建Spring Cloud Zuul网关 构建网关 请求路由 请求过滤 三.路由详解 一.Zuul 介绍 ​ 通过前几篇文章的介绍,我们了解了Spring Cloud ...

  7. AngularJS的核心对象angular上的方法全面解析(AngularJS全局API)

    总结一下AngularJS的核心对象angular上的方法,也帮助自己学习一下平时工作中没怎么用到的方法,看能不能提高开发效率.我当前使用的Angularjs版本是1.5.5也是目前最新的稳定版本,不 ...

  8. AngularJs之六(服务)

    服务:AngularJS 中,服务是一个函数或对象,可在你的 AngularJS 应用中使用.AngularJS 内建了30 多个服务. 最常用的服务:$location  服务,  $http 服务 ...

  9. api服务端接口安全

    api服务端接口安全性解析 http://blog.csdn.net/tenfyguo/article/details/8225279 常用的基于token的实现方案 http://blog.csdn ...

随机推荐

  1. linux 串口驱动(三) 【转】

    转自:http://blog.chinaunix.net/uid-27717694-id-3495825.html 三.串口的打开在用户空间执行open操作的时候,就会执行uart_ops->o ...

  2. 错误的理解引起的bug async await 执行顺序

    今天有幸好碰到一个bug,让我知道了之前我对await async 的理解有点偏差. 错误的理解 之前我一直以为  await 后面的表达式,如果是直接返回一个具体的值就不会等待,而是继续执行asyn ...

  3. shell加密

    如何保护自己编写的shell程序要保护自己编写的shell脚本程序,方法有很多,最简单的方法有两种:1.加密 2.设定过期时间,下面以shc工具为例说明: 一.下载安装shc工具shc是一个加密she ...

  4. 阿里云服务器配置nginx和PHP

    1. 安装及启动nginx 输入yum install nginx命令进行nginx的安装,当需要确认时输入”y“确认. yum install nginx 安装完成后,输入service nginx ...

  5. 【OpenCV for Android】Android Studio JNI和NDK配置及采坑记录

    在配置好Android studio的OpenCV环境后,我们就可以通过Java代码调用OpenCV的API了,但是在通常情况下,用Java代码编写图像处理算法的运行效率是没有C++代码高的,在应用层 ...

  6. AnyRobot

    AnyRobot http://www.sohu.com/a/151456051_656915 https://www.sohu.com/a/238065475_656915 http://www.d ...

  7. Eclipse导入Android项目的方法(转)

    原文:http://www.cnblogs.com/SkyD/archive/2010/11/25/1887219.html 看网上流传的Eclipse导入项目的方法都是在新建Android程序时使用 ...

  8. 【LOJ】#2079. 「JSOI2016」轻重路径

    题解 写数据结构的时候我代码就会变得非常非常长 一看别人1.5K 2.3K 我6.3K-- orzzzzz 我们很容易想到离线倒着插入,然而,有个小锅叫如果size相同保持原来的重儿子不变 我们需要写 ...

  9. XML与HTML区别

    —————————— ASP.Net+Android+IOS开发..Net培训.期待与您交流!—————————— Xml简介 1. xml是什么? Xml 是eXtended markup lang ...

  10. 浅谈Spring的AOP实现-代理机制

    说起Spring的AOP(Aspect-Oriented Programming)面向切面编程大家都很熟悉(Spring不是这次博文的重点),但是我先提出几个问题,看看同学们是否了解,如果了解的话可以 ...