自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

如何利用AngularJS服務(wù)接入外部API

譯文
開發(fā) 前端
除了輕松對HTML進行擴展的能力之外,AngularJS還提供一套簡便途徑、幫助我們與外部API實現(xiàn)交互。在今天的教程中,我們將共同探討如何利用其服務(wù)與GitHub的API相對接,進而創(chuàng)建一套簡單的庫瀏覽器。

如何利用AngularJS服務(wù)接入外部API

除了輕松對HTML進行擴展的能力之外,AngularJS還提供一套簡便途徑、幫助我們與外部API實現(xiàn)交互。在今天的教程中,我們將共同探討如何利用其服務(wù)與GitHub的API相對接,進而創(chuàng)建一套簡單的庫瀏覽器。

***步:準(zhǔn)備工作

我們就以下面這套基礎(chǔ)HTML模板為起點:

  1. <!DOCTYPE html> 
  2. <html> 
  3.     <head> 
  4.         <title>GitHub Search</title> 
  5.     </head> 
  6.     <body> 
  7.    
  8.     </body> 
  9. </html> 

現(xiàn)在將AngularJS腳本添加到該文檔的<head>當(dāng)中:

  1. <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.16/angular.min.js"></script> 

在此之后,我們可以在將這套CCS樣式添加到行內(nèi)或者獨立的文件當(dāng)中:

 

  1. * {  
  2.     -webkit-box-sizing: border-box;  
  3.     -moz-box-sizing: border-box;  
  4.     box-sizing: border-box;  
  5.     font-familysans-serif;  
  6. }  
  7.    
  8. body, html { margin0; }  
  9. p { margin0; }  
  10. input { width100%; }  
  11.    
  12. pre {  
  13.     white-space: pre-wrap;  
  14.     white-space: -moz-pre-wrap;  
  15.     white-space: -pre-wrap;  
  16.     white-space: -o-pre-wrap;  
  17.     word-wrap: break-word;  
  18. }  
  19.    
  20. div.repo {  
  21.     border-bottom1px solid;  
  22.     cursorpointer;  
  23. }  
  24.    
  25. #search#repo#user { floatleft; }  
  26. #search { width20%; }  
  27. #repo { width60%; }  
  28. #user { width20%; } 

 

如大家所見,其中不存在任何多余的內(nèi)容、只保留最基礎(chǔ)的布局方案——將搜索欄置于右側(cè)、庫信息位于中央、用戶庫同樣置于右側(cè)。我們還需要將對應(yīng)代碼行打包至<pre>標(biāo)簽當(dāng)中,此后我們還要利用它顯示README文件內(nèi)容——因為這些內(nèi)容通常來自GitHub Flavored Markdown、而且其中一部分代碼行與用戶庫列表存在重疊。

當(dāng)然,大家可以向其中添加更多樣式以提升成果的視覺效果——但請注意,本教程中的截圖都采取最基本的外觀設(shè)計。

大家可以未來需要編寫的JavaScript代碼置于本文檔的<head>當(dāng)中或者為其建立獨立文件,但獨立文件仍然需要處于AngularJS腳本之下。

第二步:模塊

現(xiàn)在我們可以為自己的應(yīng)用程序創(chuàng)建一個模塊:

  1. var app = angular.module('githubsearch', []); 

接下來利用ngApp指令將其添加到<body>標(biāo)簽當(dāng)中:

  1. <body ng-app="githubsearch"> 

第三步:控制器

我們還需要為自己的應(yīng)用程序準(zhǔn)備一套控制器。為了簡化創(chuàng)建流程,我們將只為應(yīng)用準(zhǔn)備一套控制器,這樣我們就不必考慮如何在不同控制器之間進行信息傳遞了:

 

  1. app.controller('SearchController'function SearchController($scope) {  
  2.        
  3. }); 

 

第四步:基礎(chǔ)服務(wù)

我們需要對自己的GitHub服務(wù)進行定義:

 

  1. app.factory('GitHub'function GitHub($http) {  
  2.     return {  
  3.    
  4.     };  
  5. });  

 

我們將使用app.factory()方法,這樣就能保證返回對象附帶幾個以后將會用到的方法。我們將使用$http服務(wù)從GitHub的API中獲取數(shù)據(jù)。

第五步:搜索庫

我們服務(wù)中的***項方法負責(zé)利用GitHub API對庫進行搜索。使用服務(wù)非常簡單(這項函數(shù)能夠進入由制造函數(shù)返回的對象):

 

  1. searchRepos: function searchRepos(query, callback) {  
  2.     $http.get('https://api.github.com/search/repositories', { params: { q: query } })  
  3.         .success(function (data) {  
  4.             callback(null, data);  
  5.         })  
  6.         .error(function (e) {  
  7.             callback(e);  
  8.         });  

 

$http.get()方法是執(zhí)行GET請求的一種捷徑。***條參數(shù)是我們希望訪問的URL。第二條參數(shù)則代表一個具備選項的對象。這里我們只需要params對象——它是一個查詢參數(shù)散列,將被添加到該請求當(dāng)中(其中q參數(shù)屬于搜索字符串,大家可以點擊此處了解更多相關(guān)信息)。

$http.get()會返回一項承諾。我們可以將監(jiān)聽器附加在success()與error()上,并且據(jù)此調(diào)用回調(diào)函數(shù)。

第六步:搜索欄

為了使用我們在之前幾步中定義完成的函數(shù),我們需要在自己的HTML當(dāng)中添加搜索欄。相關(guān)代碼非常簡單,如下所示:

 

  1. <div id="search"> 
  2.     <input ng-model="query" placeholder="search" ng-keyup="$event.keyCode == 13 && executeSearch()"> 
  3.     <div class="repo" ng-repeat="repo in repos" ng-click="openRepo(repo.full_name)"> 
  4.         <strong>{{ repo.full_name }}</strong> 
  5.         <p>{{ repo.description }}</p> 
  6.     </div> 
  7. </div> 

 

我們使用ngModel指令將該輸入欄中的值指向至Scope query變量,并在用戶按下回車鍵后利用ngKeyup調(diào)用executeSearch()函數(shù)(這樣$event.keyCode == 13就會進行比較)。我們無法在AngularJS表達式中使用條件語句,但一條簡單的邏輯運算符(AND)足以很好地完成這項任務(wù)。

在輸入域下面,我們使用ngRepeat來顯示搜索結(jié)果。我們將顯示該庫的完整名稱與描述(如果需要顯示其它不同內(nèi)容,大家可以點擊此處查看GitHub API說明文檔中的可用域)。

我們還使用ngClick通過該庫的完整名稱來調(diào)用openRepo()函數(shù),這樣我們就能顯示與之相關(guān)的信息。我們稍后再對該函數(shù)進行定義。

#p#

第七步:使用搜索功能

現(xiàn)在我們終于可以使用自己創(chuàng)建完成的服務(wù)了。首先,將GitHub參數(shù)添加至控制器函數(shù)(這樣該服務(wù)就能被注入到AngularJS當(dāng)中):

  1. app.controller('SearchController'function SearchController($scope) { 

現(xiàn)在定義executeSearch()函數(shù):

 

  1. $scope.executeSearch = function executeSearch() {  
  2.     GitHub.searchRepos($scope.query, function (error, data) {  
  3.         if (!error) {  
  4.             $scope.repos = data.items;  
  5.         }  
  6.     });  

 

如大家所見,我們利用來自$scope.query的搜索字符串從當(dāng)中調(diào)用GitHub.searchRepos(),而后在回調(diào)中將搜索結(jié)果(來自data.items)加入$scope.repos變量。

只要執(zhí)行以上步驟,我們就能順利顯示出搜索結(jié)果。在瀏覽器中打開我們的HTML文件并嘗試進行搜索:

 

第八步:獲取庫中的數(shù)據(jù)

現(xiàn)在我們已經(jīng)獲得了搜索功能,可以顯示出庫中用戶所選定的信息內(nèi)容。下面我們再創(chuàng)建一條函數(shù),旨在通過自己的服務(wù)獲取來自庫的數(shù)據(jù):

 

  1. getRepo: function getRepo(name, callback) {  
  2.     $http.get('https://api.github.com/repos/'+ name)  
  3.         .success(function (data) {  
  4.             callback(null, data);  
  5.         })  
  6.         .error(function (e) {  
  7.             callback(e);  
  8.         });  
  9.     }  

被傳遞至此函數(shù)的名稱必須為完整名稱(結(jié)構(gòu)為:作者名稱、斜杠、庫名稱——例如angular/angular.js),這是因為我們需要將其傳遞至GitHub API(點擊此處查看更多說明)。

第九步:獲取庫中的README文件

README文件中的內(nèi)容并未被包含在我們利用以上函數(shù)獲取到的數(shù)據(jù)當(dāng)中。相反,大家需要利用另一個API進行調(diào)用及獲取,因此我們需要創(chuàng)建以下函數(shù):

  1. getReadme: function getReadme(name, callback) {  
  2.     $http.get('https://api.github.com/repos/'+ name +'/readme')  
  3.         .success(function (data) {  
  4.             callback(null, atob(data.content));  
  5.         })  
  6.         .error(function (e) {  
  7.             callback(e);  
  8.         });  

這條函數(shù)與之前我們創(chuàng)建完畢的兩條基本相同,只不過對URL進行了變更。我們還要利用atob()函數(shù)解碼README文件的內(nèi)容,因為它采用base64編碼機制。大家可以點擊此處查看GitHub API說明文檔中與獲取README文件內(nèi)容相關(guān)的信息。

我們之所以沒有將這兩條請求塞進同一個函數(shù)當(dāng)中,是因為某些庫根本不具備 README文件。如果我們將二者強行結(jié)合,應(yīng)用程序可能因此發(fā)生故障。

第十步:顯示庫信息

我們將在另一個元素<div>當(dāng)中顯示庫的完整名稱、查看過該庫的人數(shù)以及README文件:

 

  1. <div id="repo" ng-show="activeRepo"> 
  2.     <strong>{{ activeRepo.full_name }}</strong> <em>Watched by {{ activeRepo.watchers_count }} people.</em> 
  3.     <pre>{{ activeRepo.readme }}</pre> 
  4. </div> 

 

我們將把該信息保存在控制器Scope內(nèi)的activeRepo變量當(dāng)中。只要存在可以顯示的數(shù)據(jù),ngShow就會將該元素顯示出來(如果不存在可以顯示的數(shù)據(jù),我們將只能看到‘Watched by people’文本,而且沒有任何庫被選中)。

第十一步:更新控制器

我們還需要對控制器進行更新,從而保證其切實獲取到庫數(shù)據(jù)并將其納入Scope當(dāng)中。下面創(chuàng)建我們之前附加至ngClick指令的openRepo()函數(shù):

 

  1. $scope.openRepo = function openRepo(name) {  
  2.     GitHub.getRepo(name, function (error, data) {  
  3.         if (!error) {  
  4.             $scope.activeRepo = data;  
  5.    
  6.             GitHub.getReadme(name, function (error, data) {  
  7.                 if (!error) {  
  8.                     $scope.activeRepo.readme = data;  
  9.                 } else {  
  10.                     $scope.activeRepo.readme = 'No README found!';  
  11.                 }  
  12.             });  
  13.         }  
  14.     });  

 

如大家所見,我們首先使用GitHub.getRepo()方法、檢查錯誤而后將該數(shù)據(jù)引入activeRepo變量。接下來,我們獲取README文件——如果該文件不存在,我們需要向用戶提示該情況。

現(xiàn)在大家可以再次運行自己的應(yīng)用程序并查看其實際效果:

 

第十二步:獲取用戶的庫

為了將更多功能引入到我們的應(yīng)用程序當(dāng)中,我們將為屏幕右方已被選定庫的持有者顯示其所有可用庫。這要求我們向服務(wù)中引入另一個方法:

 

  1. getUserRepos: function getUser(name, callback) {  
  2.     $http.get('https://api.github.com/users/'+ name +'/repos')  
  3.         .success(function (data) {  
  4.             callback(null, data);  
  5.         })  
  6.         .error(function (e) {  
  7.             callback(e);  
  8.         });  

 

其內(nèi)容與此前的幾條幾乎無甚差別(大家可以點擊此處查看更多與此API請求相關(guān)的信息)。

第十三步:顯示用戶的庫

這基本上相當(dāng)于重現(xiàn)HTML中的搜索欄機制,不過我們實際需要顯示的是用戶名稱與user對象中的庫,而非輸入域或者Scope本身:

 

  1. <div id="user"> 
  2.     <strong>{{ user.login }}</strong> 
  3.     <div class="repo" ng-repeat="repo in user.repos" ng-click="openRepo(repo.full_name)"> 
  4.         <strong>{{ repo.name }}</strong> 
  5.         <p>{{ repo.description }}</p> 
  6.     </div> 
  7. </div> 

 

到了這一步,大家應(yīng)該已經(jīng)擁有了一套能夠切實運作的AngularJS應(yīng)用程序——它可以根據(jù)搜索字符串獲取GitHub庫。大家可以進一步對其進行迭代,例如向其中添加更多功能或者為其設(shè)計完全不同的外觀樣式。

歡迎大家在評論欄中留下自己的實踐心得、疑問、評論以及反饋意見!

英文:http://code.tutsplus.com/tutorials/accessing-external-apis-using-angularjss-services--cms-21884

責(zé)任編輯:林師授 來源: 51CTO
相關(guān)推薦

2014-10-13 13:44:00

AngularJS2048

2015-11-27 09:18:11

AngularJSWeb應(yīng)用

2022-08-09 12:27:37

API集成微服務(wù)

2019-11-13 11:52:46

區(qū)塊鏈API比特幣

2009-12-10 14:04:18

靜態(tài)路由器

2016-02-15 10:18:11

2022-06-02 10:41:45

智能家居設(shè)備安全移動安全

2024-06-05 08:00:00

2011-12-23 09:28:31

Java

2023-10-11 09:54:59

Java開發(fā)

2014-01-06 10:44:17

Angular數(shù)據(jù)

2013-11-06 13:55:27

AngularJS服務(wù)

2023-07-26 17:13:38

2021-10-14 06:51:55

云原生AWS安全

2018-02-10 10:22:08

2023-12-11 15:12:12

2022-09-28 07:18:34

服務(wù)限流部署

2017-04-20 09:49:35

SwashbuckleWeb API Hel核心

2020-11-02 08:23:36

shell腳本Linux

2010-06-27 17:24:13

外部冷源機房制冷
點贊
收藏

51CTO技術(shù)棧公眾號