国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 網(wǎng)站 > WEB開(kāi)發(fā) > 正文

AngulerJS學(xué)習(xí)(二) 依賴注入

2024-04-27 15:14:02
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

簡(jiǎn)介:

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

AngularJS依賴注入

PRovider服務(wù)($provide)

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

valuefactoryserviceproviderconstantdecorator (打醬油)

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)然除了constantprovider是一個(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í)例。只要你編寫了一個(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í)例一次的話,那么它也沒(méi)什么了不起的。它的厲害之處在于,他能夠通過(guò)服務(wù)名稱緩存從一個(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)用,因此你不能在其中注入任何東西。


上一篇:居中布局

下一篇:pjax使用心得

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 原阳县| 和田县| 赣州市| 盐源县| 茂名市| 大同县| 抚远县| 高唐县| 鱼台县| 南川市| 涟源市| 高阳县| 承德市| 陆丰市| 芜湖县| 无极县| 九寨沟县| 德格县| 乌鲁木齐县| 宜章县| 邯郸市| 武冈市| 松桃| 汝阳县| 安岳县| 太保市| 长兴县| 镇巴县| 革吉县| 马公市| 林芝县| 鲜城| 肇东市| 柏乡县| 卫辉市| 涞水县| 浮山县| 玉林市| 内丘县| 南召县| 札达县|