1. 程式人生 > >angular js中的依賴注入是什麼?

angular js中的依賴注入是什麼?

這裡是修真院前端小課堂,每篇分享文從

【背景介紹】【知識剖析】【常見問題】【解決方案】【編碼實戰】【擴充套件思考】【更多討論】【參考文獻】

八個方面深度解析前端知識/技能,本篇分享的是:

【angular js中的依賴注入是什麼? 】

【JS-7】 

             angular js中的依賴注入是什麼? 

             分享人:朱士峰 

         

         

             目錄 

             1.背景介紹 

             2.知識剖析 

             3.常見問題 

             4.解決方案 

             5.編碼實戰 

             6.擴充套件思考 

             7.參考文獻 

             8.更多討論 

         

         

 一.背景介紹 

         

         

             

                依賴注入式AngularJS的重要特性之一,依賴注入簡化了Angular解析模組/元件之間依賴的過程。

                什麼是依賴注入 

                wiki 上的解釋是:依賴注入(Dependency Injection,簡稱DI)是一種軟體設計模式,在這種模式下,

                一個或更多的依賴(或服務)被注入(或者通過引用傳遞)到一個獨立的物件(或客戶端)中,然後成為了該客戶端狀態的一部分。

                該模式分離了客戶端依賴本身行為的建立,這使得程式設計變得鬆耦合,並遵循了依賴反轉和單一職責原則。與服務定位器模式形

                成直接對比的是,它允許客戶端了解客戶端如何使用該系統找到依賴 . 

                一句話 --- 沒事你不要來找我,有事我會去找你。

         

         

             

二.知識剖析 

             

             

                 angular依賴注入機制 

                 AngularJS 提供了5個核心元件用來作為依賴注入: 

                    value

                    factory

                    service

                    provider

                    constant 

             

             

                 $provide (供應商) 

                 供應商==>泛指provider 

                 服務==>泛指service 

                 provider==>provider()方法建立的東東

                 service==>service()方法建立的東東 

                 

                    $provide服務負責告訴Angular如何創造一個新的可注入的東西:即服務。服務會被叫做供應商的東西來定義,我們可以使用$provide來建立一個供應商。

                    我們需要使用$provide中的provider()方法來定義一個供應商,同時也可以通過要求$provide被注入到一個應用的config函式中來獲得$provide服務。看圖

                 

             

              

 

            

                 看一個例子: 

                 

                     

                        angular.module(‘app’,[]).config(function($provide) {

                            $provide.provider('greeting', function() {

                                this.$get = function() {

                                    return function(name) {

                                    alert("Hello, " + name);

                                    };

                                };

                            });

                        });

                     

                 

                在上面的例子中我們為一個服務定義了一個叫做greeting的新provider。

                我們可以把一個叫做greeting的變數注入到任何可注入的函式中

                (例如控制器)然後Angular就會呼叫這個provider的$get函式來返回這個服務的一個例項

                在上面的例子中,被注入的是一個函式,

                它接受一個引數並且根據這個引數alert一條資訊。我們可以像下面這樣使用它:

      

                        app.controller('MyCtrl', function($scope, greeting) {

                            $scope.onClick = function() {

                                greeting('Ford Prefect');

                            };

                        });

          

                 定義供應商的方法 

                 1、Constant 

                 Constant定義常量Constant定義的值不應該被改變,它可以被注入到任何地方,但不能被裝飾器(decorator)裝飾 

                 

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

                            app.config(function ($provide) {

                                $provide.constant('myConstant', 'The Matrix');

                            });

        

                語法糖:

                 

                        app.constant('myConstant', 'The Matrix');

                     

                

                 2、Value 

                 Value可以是string,number甚至function,它和constant的不同之處在於,它可以被修改,不能被注入到config中,但是它可以被decorator裝飾 

                 

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

                            app.config(function ($provide) {

                                $provide.value('myValue', 'The Matrix')

                            });

                     

                 

                語法糖:

                 

                        app.value('myValue', 'The Matrix');

                     

                 

             

             

                 3、Service 

                    Service是一個可注入的構造器,在AngularJS中它是單例的,用它在Controller中通訊或者共享資料都很合適.

                    在service裡面可以不用返回東西,因為AngularJS會呼叫new關鍵字來建立物件。

                 

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

                        app.config(function ($provide) {

                            $provide.service('myService', function () {

                                this.title = 'The Matrix';

                            });

                        });

                

                p語法糖:

                    

                        app.service('myService', function () {

                            this.title = 'The Matrix';

                        });

                     

              

                 4、Factory 

 

                  Factory是一個可注入的function,它和service的區別就是:factory是普通function,而service是一個構造器(constructor),

                    Angular在呼叫service時會用new關鍵字,而呼叫factory時只是呼叫普通的function,所以factory可以返回任何東西,而service可以不返回.

                    factory可以返回任何東西,它實際上是一個只有$get方法的provider 

 

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

                        app.config(function ($provide) {

                            $provide.factory('myFactory', function () {

                                return {

                                    title: 'The Matrix'

                                }

                            });

                        });

        

              語法糖:

                        app.factory('movie', function () {

                            return {

                                title: 'The Matrix'

                            }

                        });

               

                 Provider 

                 provider是value,Service,Factory的老大,除了constant其它都是provider的封裝。

                    provider必須有一個$get方法,當然也可以說provider是一個可配置的factory 

                 

                        app.provider('greeting', function() {

                            var text = 'Hello, ';

                            this.setText = function(value) {

                                text = value;

                            };

                            this.$get = function() {

                                return function(name) {

                                    alert(text + name);

                                };

                        };

                    });

                        app.config(function(greetingProvider) {

                        greetingProvider.setText("Howdy there, ");

                    });

                        app.run(function(greeting) {

                        greeting('Ford Prefect');

                    });

                  

                 注意這裡config方法注入的是greetingProvider,上面定義了一個供應商叫greeting,但是注入到config中不能直接寫greeting,因為前文講了注入的那個東西就是服務,是供應商提供出來的,而config中又只能注入供應商(兩個例外是$provide和$injector), 所以用駝峰命名法寫成greetingProvider,Angular就會幫你注入它的供應商。 

                 

               

                    AngularJS分兩個階段執行我們的用 – config階段和run階段。config階段是我們設定任何的provider的階段。

                    它也是我們設定任何的指令,控制器,過濾器以及其它東西的階段。在run階段,AngularJS會編譯你的DOM並啟動我們的應用。

                 

             

 

三.常見問題          

1. factorry和value等服務與provider都是提供服務,為什麼還有人要使用provider?

 

 

 

2.請描述下factory和service的區別

 

 

 

3.依賴注入有哪幾種方式?

 

四.解決方案

 問題1回答:

 

        

 

provider允許我們進行一些配置。

 

在前面我們已經提到過當你通過provider(或者其他簡寫方法)建立一個服務時,你實際上建立了一個新的provider,

它將定義我們的服務如何被建立。這些provider可以被注入到config函式中,我們可以和它們進行一些互動。

 

 

 

 問題2回答:

 

factory是普通function,而service是一個構造器(constructor),

 

 Angular在呼叫service時會用new關鍵字,而呼叫factory時只是呼叫普通的function,

 

 所以factory可以返回任何東西,而service可以不返回.factory可以返回任何東西,

 

 它實際上是一個只有$get方法的provider 

 

 

 

問題3回答:

 

依賴注入有三種方式

 

1.通過陣列標註在方法的引數中宣告依賴

 

2.使用控制器構造方法的$inject屬性注入依賴

 

3.通過方法引數隱式推斷依賴

 

五.編碼實戰

六.拓展思考

這些依賴元件的本質是什麼?

 

factory,service以及value全部都是用來定義一個provider的簡寫,

 

它們提供了一種方式來定義一個provider而無需輸入所有的複雜的程式碼。

 

 

 

七.參考文獻 

             參考一:

            https://segmentfault.com/a/1190000003096933

                   AngularJS中的Provider們:Service和Factory等的區別

             

             參考二:

                http://www.html-js.com/article/1980

                   理解AngularJS中的依賴注入

             

         

         

 八.更多討論 

--------------------- 

 

 

 

PPT連結 視訊連結

更多內容,可以加入IT交流群565734203與大家一起討論交流

這裡是技能樹·IT修真院:https://www.jnshu.com,初學者轉行到網際網路的聚集地