亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

AngularJS學(xué)習(xí)第二篇 AngularJS依賴(lài)注入

 更新時(shí)間:2017年02月13日 09:18:17   作者:左手121  
這篇文章主要為大家詳細(xì)介紹了AngularJS學(xué)習(xí)第二篇,理解什么是AngularJS依賴(lài)注入,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

簡(jiǎn)介:

首先我們需要理解什么是依賴(lài)注入?
控制反轉(zhuǎn)和依賴(lài)注入有什么區(qū)別?

假定:應(yīng)用程序A,需要訪(fǎng)問(wèn)外部資源C。這里使用了容器B(是指用來(lái)實(shí)現(xiàn) IOC/DI 功能的一個(gè)框架程序)。
A需要訪(fǎng)問(wèn)C
B獲取C然后返回給A
IOC inversion of control 控制反轉(zhuǎn):站在容器角度。B控制A,由B反向的向A注入C。即容器控制應(yīng)用程序,由容器反向的向應(yīng)用程序注入應(yīng)用程序所需要的外部資源。
DI Dependency Injection 依賴(lài)注入:站在應(yīng)用程序的角度。A依賴(lài)B獲取C,B將C注入A。即應(yīng)用程序依賴(lài)容器創(chuàng)建并注入它所需要的外部資源。

AngularJS依賴(lài)注入

Provider服務(wù)($provide)

AngularJS 提供很好的依賴(lài)注入機(jī)制。以下5個(gè)核心組件用來(lái)作為依賴(lài)注入:

value
factory
service
provider
constant
decorator (打醬油)

Constant

定義常量用的,這貨定義的值當(dāng)然就不能被改變,它可以被注入到任何地方,但是不能被裝飾器(decorator)裝飾

var app = angular.module('app', []);
app.config(function ($provide) {
 $provide.constant('movieTitle', 'The Matrix');
});
app.controller('ctrl', function (movieTitle) {
 expect(movieTitle).toEqual('The Matrix');
});
// 語(yǔ)法糖:
app.constant('movieTitle', 'The Matrix');

Value

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

var app = angular.module('app', []);
app.config(function ($provide) {
 $provide.value('movieTitle', 'The Matrix')
});
app.controller('ctrl', function (movieTitle) {
 expect(movieTitle).toEqual('The Matrix');
});
// 語(yǔ)法糖:
app.value('movieTitle', 'The Matrix');

Service

它是一個(gè)可注入的構(gòu)造器,在AngularJS中它是單例的,用它在Controller中通信或者共享數(shù)據(jù)都很合適。

var app = angular.module('app' ,[]);
app.config(function ($provide) {
 $provide.service('movie', function () {
  this.title = 'The Matrix';
 });
});
app.controller('ctrl', function (movie) {
 expect(movie.title).toEqual('The Matrix');
});
// 語(yǔ)法糖:
app.service('movie', function () {
 this.title = 'The Matrix';
});

Factory

它是一個(gè)可注入的function,它和service的區(qū)別就是:factory是普通function,而service是一個(gè)構(gòu)造器(constructor),這樣Angular在調(diào)用service時(shí)會(huì)用new關(guān)鍵字,而調(diào)用factory時(shí)只是調(diào)用普通的function,所以factory可以返回任何東西,而service可以不返回(可查閱new關(guān)鍵字的作用)。

var app = angular.module('app', []);
app.config(function ($provide) {
 $provide.factory('movie', function () {
  return {
   title: 'The Matrix';
  }
 });
}); 
app.controller('ctrl', function (movie) {
 expect(movie.title).toEqual('The Matrix');
});
// 語(yǔ)法糖
app.factory('movie', function () {
 return {
  title: 'The Matrix';
 }
});

Provider

provider是他們的老大,上面的幾乎(除了constant)都是provider的封裝,provider必須有一個(gè)$get方法,當(dāng)然也可以說(shuō)provider是一個(gè)可配置的factory。

var app = angular.module('app', []);
app.provider('movie', function () {
 var version;
 return {
  setVersion: function (value) {
   version = value;
  },
  $get: function () {
   return {
     title: 'The Matrix' + ' ' + version
   }
  }
 }
});
app.config(function (movieProvider) {
 movieProvider.setVersion('Reloaded');
});
app.controller('ctrl', function (movie) {
 expect(movie.title).toEqual('The Matrix Reloaded');
});

Decorator

這個(gè)比較特殊,它不是provider,它是用來(lái)裝飾其他provider的,而前面也說(shuō)過(guò),他不能裝飾Constant,因?yàn)閷?shí)際上Constant不是通過(guò)provider()方法創(chuàng)建的。

var app = angular.module('app', []);
app.value('movieTitle', 'The Matrix');
app.config(function ($provide) {
 $provide.decorator('movieTitle', function ($delegate) {
  return $delegate + ' - starring Keanu Reeves';
 });
});
app.controller('myController', function (movieTitle) {
 expect(movieTitle).toEqual('The Matrix - starring Keanu Reeves');
});

總結(jié):

所有的供應(yīng)商都只被實(shí)例化一次,也就說(shuō)他們都是單例的
除了constant,所有的供應(yīng)商都可以被裝飾器(decorator)裝飾
value就是一個(gè)簡(jiǎn)單的可注入的值
service是一個(gè)可注入的構(gòu)造器
factory是一個(gè)可注入的方法
decorator可以修改或封裝其他的供應(yīng)商,當(dāng)然除了constant
provider是一個(gè)可配置的factory

上述來(lái)源:(AngularJS中的Provider們:Service和Factory等的區(qū)別)https://segmentfault.com/a/1190000003096933

注入器($injector)

注入器負(fù)責(zé)從我們通過(guò) provide 創(chuàng)建的服務(wù)中創(chuàng)建注入的實(shí)例。只要你編寫(xiě)了一個(gè)帶有可注入性的參數(shù),你都能看到注入器是如何運(yùn)行的。每一個(gè) AngularJS 應(yīng)用都有唯一一個(gè) injector,當(dāng)應(yīng)用啟動(dòng)的時(shí)候它被創(chuàng)造出來(lái),你可以通過(guò)將 injector 注入到任何可注入函數(shù)中來(lái)得到它($injector 知道如何注入它自己?。?。
一旦你擁有了 injector,你可以動(dòng)過(guò)調(diào)用 get 函數(shù)來(lái)獲得任何一個(gè)已經(jīng)被定義過(guò)的服務(wù)的實(shí)例。

var movie = $injector.get('movie');
expect(movie.title).toEqual('The Matrix Reloaded');

注入器同樣也負(fù)責(zé)將服務(wù)注入到函數(shù)中;例如,你可以魔法般的將服務(wù)注入到任何函數(shù)中,只要你使用了注入器的 invoke 方法:

var myFunction = function(movie) {
 return movie.title;
};
$injector.invoke(myFunction);

如果注入器只是創(chuàng)建一個(gè)服務(wù)的實(shí)例一次的話(huà),那么它也沒(méi)什么了不起的。它的厲害之處在于,他能夠通過(guò)服務(wù)名稱(chēng)緩存從一個(gè) provider 中返回的任何東西,當(dāng)你下一次再使用這個(gè)服務(wù)時(shí),你將會(huì)得到同一個(gè)對(duì)象。
因此,你可以通過(guò)調(diào)用 injector.invike 將服務(wù)注入到任何函數(shù)中也是合情合理的了。包括:

  • 控制器定義函數(shù)
  • 指令定義函數(shù)
  • 過(guò)濾器定義函數(shù)
  • provider中的$get方法(也就是factory函數(shù))

由于constant和value總是返回一個(gè)靜態(tài)值,它們不會(huì)通過(guò)注入器被調(diào)用,因此你不能在其中注入任何東西。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 全面解析Angular中$Apply()及$Digest()的區(qū)別

    全面解析Angular中$Apply()及$Digest()的區(qū)別

    $apply()和$digest()在AngularJS中是兩個(gè)核心概念,但是有時(shí)候它們又讓人困惑。這篇文章主要介紹了Angular中$Apply()及$Digest()區(qū)別詳細(xì)說(shuō)明的相關(guān)資料,需要的朋友可以參考下
    2016-08-08
  • Angular1.x復(fù)雜指令實(shí)例詳解

    Angular1.x復(fù)雜指令實(shí)例詳解

    這篇文章主要介紹了Angular1.x復(fù)雜指令,結(jié)合實(shí)例形式分析了指令的使用、模板指令、指令的作用域等概念與具體使用技巧,需要的朋友可以參考下
    2017-03-03
  • 整理AngularJS框架使用過(guò)程當(dāng)中的一些性能優(yōu)化要點(diǎn)

    整理AngularJS框架使用過(guò)程當(dāng)中的一些性能優(yōu)化要點(diǎn)

    這篇文章主要介紹了AngularJS框架使用過(guò)程當(dāng)中的一些性能優(yōu)化要點(diǎn),Angular通常被用來(lái)制作大型單頁(yè)應(yīng)用,因而性能問(wèn)題也是必須考慮的因素,需要的朋友可以參考下
    2016-03-03
  • angular2系列之路由轉(zhuǎn)場(chǎng)動(dòng)畫(huà)的示例代碼

    angular2系列之路由轉(zhuǎn)場(chǎng)動(dòng)畫(huà)的示例代碼

    本篇文章主要介紹了angular2系列之路由轉(zhuǎn)場(chǎng)動(dòng)畫(huà)的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11
  • Angular中AuthGuard路由守衛(wèi)的創(chuàng)建使用

    Angular中AuthGuard路由守衛(wèi)的創(chuàng)建使用

    這篇文章主要為大家介紹了Angular中AuthGuard路由守衛(wèi)的創(chuàng)建使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • Angular實(shí)現(xiàn)form自動(dòng)布局

    Angular實(shí)現(xiàn)form自動(dòng)布局

    這篇文章主要介紹了Angular實(shí)現(xiàn)form自動(dòng)布局的相關(guān)資料,以代碼片段的形式分析了Angular實(shí)現(xiàn)form自動(dòng)布局的實(shí)現(xiàn)方法,感興趣的小伙伴們可以參考一下
    2016-01-01
  • Angular彈出模態(tài)框的兩種方式

    Angular彈出模態(tài)框的兩種方式

    這篇文章主要介紹了Angular彈出模態(tài)框的兩種方式,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-10-10
  • angularjs中的$eval方法詳解

    angularjs中的$eval方法詳解

    下面小編就為大家?guī)?lái)一篇angularjs中的$eval方法詳解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-04-04
  • Angular2開(kāi)發(fā)環(huán)境搭建教程之VS Code

    Angular2開(kāi)發(fā)環(huán)境搭建教程之VS Code

    不久前WebStorm的頻繁卡死終于讓我受不鳥(niǎo)了,我決定換個(gè)輕量級(jí)的編輯器,嘗試了Emacs、Sublime text,最后選擇了vscode。下面這篇文章主要給大家介紹了關(guān)于Angular2開(kāi)發(fā)環(huán)境搭建教程之VS Code的相關(guān)資料,需要的朋友可以參考下。
    2017-12-12
  • Angular.JS中指令ng-if的注意事項(xiàng)小結(jié)

    Angular.JS中指令ng-if的注意事項(xiàng)小結(jié)

    這篇文章主要給大家分享了關(guān)于Angular.JS中指令ng-if的一點(diǎn)注意事項(xiàng),分享出來(lái)供大家參考學(xué)習(xí),文中介紹的還是相對(duì)來(lái)說(shuō)比較詳細(xì),對(duì)大家具有一定的參考借鑒價(jià)值,需要的朋友們下面來(lái)一起看看吧。
    2017-06-06

最新評(píng)論