angularjs學習筆記--$http、資料渲染到表格、路由、依賴注入、provider

來源:互聯網
上載者:User

標籤:...   工作   oct   when   ble   main   關聯   原理   sel   

 

1—$http

  可以從伺服器中擷取更大的資料集,這裡使用angularjs的內建服務稱為$http。使用angularjs的依賴注入為phoneList組件的控制器提供服務。

 

  在我們的控制器中使用angularjs的$http服務,向我們的web伺服器發出http請求,以擷取檔案中的資料。

 

app/phone-list/phone-list.component1.js:

  angular.module(‘phoneList‘).component(‘phoneList‘,{     templateUrl:‘phone-list/phone-list.template.html‘,     controller:function PhoneListController($http){         var self = this;         self.orderProp = ‘age‘;         $http.get(‘phones/phones.json‘).then(function(response){             self.phones = response.data;         });     } });

 

ps:$http向web伺服器發出HTTP GET請求,此處URL為json檔案地址。伺服器通過提供json檔案中的資料進行響應。(響應也可以由後端伺服器動態產生)

 

該$http服務返回一個promise對象,其有一個方法,用來處理非同步響應,並將電話資料分配給控制器,作為一個屬性。  Ps:angularjs檢測到json響應,並將其解析為傳遞給我們回調的對象的屬性。

 

由於phones在一個回呼函數中對該屬性進行賦值,其中this沒有定義值,因此引入一個局部變數self,指向控制器執行個體。

 

Ps:要在angularjs中使用服務,只需將所需的依賴項的名稱聲明為控制器建構函式的參數:

function PhoneListController($http){…}

 

當構建控制器時,angularjs的依賴注入器為您的控制器提供服務。依賴注入器還負責建立服務可能具有的任何依懶性。(服務通常依賴於其他服務)。Ps: 參數名稱很重要,因為注入器使用這些進行尋找依賴關係。

 

$http服務是一個核心的angularjs服務,通過瀏覽器的XMLHttpRequest對象或通過jsonp促進與遠程HTTP伺服器的通訊。$http服務是一個函數,其接收一個參數-一個設定物件-用於產生http請求並返回promise。

$http({     method: ‘GET‘,     url: ‘/url‘ }).then(function successCallback(response) {     // this callback will be called asynchronously     // when the response is available }, function errorCallback(response) {     // called asynchronously if an error occurs     // or server returns response with an error status. });

 

Ps:響應對象具有的屬性:資料(用於變換函數轉換的響應體)、status(響應的http狀態代碼)、標題()、config(用於產生請求的設定物件)、statusText(響應的http狀態文本)、xhrStatus()

也可使用捷徑:( $http(config); )

$http.get(‘/url’,config).then(successCallback, errorCallback);$http.post(‘/url’,data,config).then(successCallback, errorCallback);$http.head(url,[config]);$http.put(url,data,[config]);$http.delete(url,[config]);$http.jsonp(url,[config]);$http.patch(url,data,[config]);

 

$http服務將自動為所有請求添加特定的http頭,這些預設值可以通過訪問當前包含此預設配置的設定物件。要添加或覆蓋這些預設值,只需從這些設定物件中添加或刪除屬性即可。

 

要添加除post或put之外的http方法的標題,只需添加一個新的對象,以較低的http方法名稱為關鍵字,如$httpProvider.defaults.headers.get = {‘My-Header’ : ‘value’}

 

預設值也可以在運行時通過對象以相同的方式設定,如:

module.run(function($http){    $http.defaults.headers.common.Authorization = ‘Basic YmVlcDpib29w’ ;});

 

可以在headers調用時傳遞的config對象中提供一個屬性,覆蓋預設值而不在全域更改它們。

 

要顯示刪除根據每個請求自動添加的$httpProvider.defaults.headers標題,請使用headers屬性,設定所需的標題為undefined:

var req = {     method:‘POST‘,     url:‘http://example.com‘,     headers:{         ‘Content-Type‘:undefined     },     data:{test:‘test‘} } $http(req).then(function(){...},function(){...});

 

Ps:$首碼用於表明是angularjs的內建服務。

 

例子:通過擷取json檔案中的資料進行頁面渲染,涉及到的檔案有:index2.html、app.module.js、phone-list.template.html、phone-list.component1.js、phones.json

 

Index2.html:

<!DOCTYPE html> <html lang="en" ng-app="phoneList"> <head>     <meta charset="UTF-8">     <title>Title</title>     <script src="../angular/angular.js"></script>     <script src="../scripts/app.module.js"></script>     <script src="phone-list/phone-list.component1.js"></script> </head> <body>    <phone-list></phone-list> </body> </html>

 

app.module.js:

//用來引入需要使用的module檔案 //定義一個phonecatAPP模組 var phonecatApp = angular.module(‘phonecatApp‘, []); //定義一個phoneList模組 var phoneList = angular.module(‘phoneList‘,[]);

 

phone-list.template.html:

<div class="container-fluid">     <div class="row">         <div class="col-md-2">             <!--Sidebar content-->             <p>                 Search: <input ng-model="$ctrl.query" />             </p>             <p>                 Sort by:                 <select ng-model="$ctrl.orderProp">                     <option value="name">Alphabetical</option>                     <option value="age">Newest</option>                 </select>             </p>         </div>         <div class="col-md-10">             <ul class="phones">                 <li ng-repeat="phone in $ctrl.phones | filter:$ctrl.query |orderBy:$ctrl.orderProp">                     <span>{{phone.name}}</span>                     <p>{{phone.snippet}}</p>                     <p>{{phone.age}}</p>                 </li>             </ul>         </div>     </div> </div>

 

phone-list.component1.js:

angular.module(‘phoneList‘).component(‘phoneList‘,{     templateUrl:‘phone-list/phone-list.template.html‘,     controller:function PhoneListController($http){         var self = this;         self.orderProp = ‘age‘;         $http.get(‘phones/phones.json‘).then(function(response){             self.phones = response.data;         });     } });

 

phones.json:

[   {     "age":13,     "id":"motorola-defy-with-motoblur",     "name":"Motorola DEFY\u2122 with MOTOBLUR\u2122",     "snippet":"Are you ready for everything life throws your way?"   },   {     "age":15,     "id":"sotorola-defy-with-motoblur",     "name":"Aotorola DEFY\u2122 with MOTOBLUR\u2122",     "snippet":"Hi!Are you ready for everything life throws your way?"   } ] 

 

例子:擷取json檔案中的資料渲染到表格中,這裡涉及的檔案有:mytableindex.html檔案、app.module.js檔案、mytable-list.template.html檔案、mytable.component.js檔案、tables.json檔案

 

mytableindex.html:

<!DOCTYPE html> <html lang="en" ng-app="tableList"> <head>     <meta charset="UTF-8">     <title>Title</title>     <script src="../angular/angular.js"></script>     <script src="../scripts/app.module.js"></script>     <script src="phone-list/mytable.component.js"></script>     <style>         table{             border:1px solid gray;         }         tr{             border-top:1px solid gray;         }     </style> </head> <body>    <table-list></table-list> </body> </html>

 

app.module.js:

//用來引入需要使用的module檔案 //定義一個phonecatAPP模組 var phonecatApp = angular.module(‘phonecatApp‘, []); //定義一個phoneList模組 var phoneList = angular.module(‘phoneList‘,[]); //定義一個tableList模組 var tableList = angular.module(‘tableList‘,[]);

 

 

mytable-list.template.html:

<div>     <table>         <caption>資訊列表</caption>         <tr>             <th>序號</th>             <th>公司</th>             <th>連絡人</th>             <th>電話</th>         </tr>         <tr ng-repeat="table in $ctrl.tables1">             <!--$ctrl.tables1指定模板js檔案中擷取到的model-->             <td>{{table.numx}}</td>             <td>{{table.companyx}}</td>             <td>{{table.contactx}}</td>             <td>{{table.phonex}}</td>         </tr>     </table> </div> <!--這裡模板的css樣式可以寫在主html檔案的style標籤內,或者在主html檔案中引入外部css檔案-->

 

mytable.component.js:

angular.module(‘tableList‘).component(‘tableList‘,{     //這裡的angular.module(‘tableList‘)也可以直接用app.module.js檔案中定義的模組tableList     //在tableList模板上定義tableList組件     templateUrl:‘phone-list/mytable-list.template.html‘,     //組件用到的模板檔案的URL     controller:function MyTableListController($http){         //這裡的controller即綁定到了組件tableList上,所以在模板中就不再需要ng指令綁定模板         var self = this;         // self.orderProp = ‘numx‘;         $http.get(‘phones/tables.json‘).then(function(response){             self.tables1 = response.data;  //tables可以理解為自己指定的變數名,指代model,即json檔案中的資料         });     } });

 

或:

angular.module(‘tableList‘).component(‘tableList‘,{     //這裡的angular.module(‘tableList‘)也可以直接用app.module.js檔案中定義的模組tableList     //在tableList模板上定義tableList組件     templateUrl:‘phone-list/mytable-list.template.html‘,     //組件用到的模板檔案的URL     controller:function MyTableListController($http){         //這裡的controller即綁定到了組件tableList上,所以在模板中就不再需要ng指令綁定模板         var self = this;         $http({             method: ‘GET‘,             url: ‘phones/tables.json‘         }).then(function successCallback(response) {             // this callback will be called asynchronously             // when the response is available             self.tables1 = response.data;         }, function errorCallback(response) {             // called asynchronously if an error occurs             // or server returns response with an error status.             return response.data;         });     } });

 

tables.json:

[   {     "numx":"1",     "companyx":"創匠",     "contactx":"zhajd",     "phonex":"17878372837"   },   {     "numx":"2",     "companyx":"創匠xinxi",     "contactx":"zskd",     "phonex":"17879072837"   },   {     "numx":"3",     "companyx":"創匠keji",     "contactx":"shdjcd",     "phonex":"17870902837"   },   {     "numx":"4",     "companyx":"創匠gs",     "contactx":"djldd",     "phonex":"17878372837"   },   {     "numx":"5",     "companyx":"chuangjiang",     "contactx":"ldos",     "phonex":"17877896837"   },   {     "numx":"6",     "companyx":"chjdkj",     "contactx":"zdljd",     "phonex":"17878567837"   } ] 

 

例子:將資料渲染到表格中

<!DOCTYPE html> <html lang="en" ng-app="exampApp"> <head>     <meta charset="UTF-8">     <title>Title</title>     <script src="../angular/angular.js"></script>     <style>         table{             border:1px solid gray;         }         td{             border-top:1px solid gray;             /*border-bottom:1px solid gray;*/         }     </style> </head> <body>  <div>     <table ng-controller="exampListController">         <tr>             <th>序號</th>             <th>公司</th>             <th>連絡人</th>             <th>電話</th>         </tr>         <tr ng-repeat="item in data">             <td>{{item.numx}}</td>             <td>{{item.companyx}}</td>             <td>{{item.contactx}}</td>             <td>{{item.phonex}}</td>         </tr>     </table> </div>  <script>     var exampApp = angular.module(‘exampApp‘,[]);     exampApp.controller(‘exampListController‘,function exampListController($scope){         $scope.data = [             {                 "numx":"1",                 "companyx":"創匠",                 "contactx":"zhajd",                 "phonex":"17878372837"             },             {                 "numx":"2",                 "companyx":"創匠xinxi",                 "contactx":"zskd",                 "phonex":"17879072837"             },             {                 "numx":"3",                 "companyx":"創匠keji",                 "contactx":"shdjcd",                 "phonex":"17870902837"             },             {                 "numx":"4",                 "companyx":"創匠gs",                 "contactx":"djldd",                 "phonex":"17878372837"             },             {                 "numx":"5",                 "companyx":"chuangjiang",                 "contactx":"ldos",                 "phonex":"17877896837"             },             {                 "numx":"6",                 "companyx":"chjdkj",                 "contactx":"zdljd",                 "phonex":"17878567837"             }         ];     }); </script> </body> </html>

 

路由:

組件允許我們以模組化、可測試的方式將控制器與模板相結合,我們將使用組件進行路由,每個路由將與一個組件相關聯,該組件將負責提供視圖模板和控制器。

angular-route.js:定義angularjs的ngRoute模組,為我們提供路由。

app.config.js:配置提供給我們的主模組。

Phone-detail.module.js:定義包含phoneDetail組件的新模組。

Phone-detail.component.js:定義一個虛擬phoneDetail組件。

 

依賴注入:

依賴注入是angularjs的核心,需要瞭解其工作原理!

當應用程式引導時,angularjs建立一個注入器,用於尋找和注入應用程式所需的所有服務。注射器僅執行以下步驟:載入您在應用程式中指定的模組定義;註冊在這些模組中定義的所有供應商;當被要求這樣做時,通過其供應商將服務及其依賴關係執行個體化為可注射功能的參數。供應商是提供(建立)服務執行個體並公開配置API的對象,可用於控制服務的建立和運行時行為。在$route服務的情況下,$routeProvider公開的API允許你為應用程式定義路由。

 

提供者($provide):該$provice服務負責告訴angular如何建立新的可注射的東西,這些東西叫服務,即$provide服務告訴angular如何建立服務。服務由所謂的供應商定義,這是在使用時建立的$provide。通過服務provider方法定義提供者$provide,$provide將其注入到應用程式的config功能中獲得服務。

myMod.config(function($provide){     $provide.provider(‘greeting‘,function(){         this.$get = function(){             return function(name){                 alert("hello" + name);             };         };     }); });

 

ps:這裡定義了名為greeting的新的供應商作為服務,我們可以注入一個名為greeting的變數可以注射到任何一個可注射的函數中,如控制器,angular將調用提供者的$get函數來返回一個新的服務執行個體。在和這種情況下,要注入的東西是一個基於name參數和alert訊息的函數。我們可以這樣使用:

myMod.controller("MainController",function($scope,greeting){     $scope.onClick = function(){         greeting("Ford Prefect");     } })

 

service、factory、value都只是定義提供者的各個部分的捷徑,即它們提供了一種定義提供者的方法,而不必輸入所有的東西:

myMod.config(function($provide){     $provide.factory(‘greeting‘,function(){         return function(name){             alert("hello, " + name);         };     }); });

 

greeting服務總是返回相同的功能,因此可以使用value來定義:

myMod.config(function($provide){     $provide.value(‘greeting‘,function(name){         alert("hello, " + name);     }); });

 

var myMod = angular.module(‘myModule‘,[]);  myMod.provider(‘greeting‘,...); myMod.factory(‘greeting‘,...); myMod.service(‘greeting‘,...); myMod.value(‘greeting‘,...); myMod.provider(‘greeting‘,function(){     this.$get = function(){         return function(name){             alert("hello, " + name);         };     }; });  
myMod.factory(‘greeting‘,function(){ return function(name){ alert("hello, " + name); }; });
myMod.service(‘greeting‘,function(){ return function(name){ alert("hello, " + name); }; });
myMod.value(‘greeting‘,function(name){ alert("hello, " + name); });

 

注射器($injector):負責使用我們提供的代碼$provide實際建立我們的服務執行個體。有了$injector,則可以使用服務get名稱調用定義的服務執行個體。注射器還負責將服務注入功能。每一個angularjs應用程式都有一個$injector,當應用程式啟動時它將被建立,可以通過注入$injector注入到任何一個可注射的函數。

一旦有了$injector,通過調用服務的get方法,可以得到一個已定義好的服務的執行個體

var greeting = $injector.get(‘greeting‘); greeting(‘Ford Prefect‘);

 

注射器還負責將服務注入到函數中:

var myFunction = function(greeting){     greeting(‘Ford Prefect‘); }; $injector.invoke(myFunction);

 

配置供應商:

提供者允許大量的配置。當通過provider或angularjs提供的捷徑建立一個服務時,就建立了一個provider,它定義了服務是如何建立的。這些providers可以注入到你的應用程式的config部分,便於互動。

Angular運行你的程式主要有兩階段:config、run;config階段可以根據需要設定任何供應商的地方,這也是設定指令、控制器、過濾器等的地方,run階段是angular實際編譯DOM並啟動應用程式的地方。可以使用myMod.config和myMod.run函數添加在這些階段中啟動並執行其他代碼。在config階段,只有供應商可以注射。

 

控制器($controller):可以將東西注入到控制器中,但不能將控制器注入到事件中。

 

過濾器(filter)和指令(directive):

 

將core模組註冊為主phonecatApp模組的依賴關係:

angular.module(‘phonecatApp‘, [ ... ‘core‘, ... ]);

 

 ps:可能稍微有點淩亂,還請見諒。所謂好記性不如爛筆頭,這是選擇寫部落格的初衷,希望通過整理能夠讓自己更深入理解,以後不清楚的地方還可以回來看看。同時,放在這種公用的地方,也希望能夠給一些人一丁點的參考,至少我從網上獲得了很多。此外,也期待描述的不妥的地方,有小夥伴可以指出,然後改進,進步。(8-17)

 參考 & 感謝:https://docs.angularjs.org

 

angularjs學習筆記--$http、資料渲染到表格、路由、依賴注入、provider

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.