AngularJS 帶有內建的依賴注入機制。您可以將您的應用程式分為多個不同類型的AngularJS可以注入到每個等組成。模組化您的應用程式可以更輕鬆地重新使用,配置和應用程式測試組件。 【相關教學推薦:《angular教學》】
AngularJS包含以下核心類型的物件與元件:
- ##價值
- 工廠
- 服務
- 提供者
- 持續的
價值
在AngularJS的值是一個簡單的物件。它可以是一個數字,字串或JavaScript物件。值通常用作注入工廠、服務或控制器的配置。 一個值必須屬於一個 AngularJS 模組。這裡有三個例子,價值觀加到AngularJS模組:var myModule = angular.module("myModule", []); myModule.value( “numberValue”,999); myModule.value( “stringValue的”, “ABC”); myModule.value("objectValue", { val1 : 123, val2 : "abc"} );這些值是使用
value()模組上的函數定義的。第一個參數是所述值的名稱,且第二參數是所述值本身。工廠,服務和控制器現在可以透過它們的名字來引用這些值。
注入價值
注入的值成AngularJS控制器功能是透過將參數具有相同的名稱作為值(傳遞給所述第一參數簡單地完成value()函數被定義的值時)。以下是一個例子:
var myModule = angular.module("myModule", []); myModule.value( “ numberValue ”,999); myModule.controller( “myController的”功能($范围,numberValue){ 的console.log(numberValue); });通知控制器功能的第二個參數是如何具有相同的名稱作為值。
工廠
#工廠是一個創造價值的函數。當服務、控制器等需要從工廠注入的值時,工廠會按需建立該值。一旦創建,該值將重新用於所有需要注入的服務、控制器等。因此,工廠與值的不同之處在於它可以使用工廠函數來建立它所傳回的物件。您也可以將值注入工廠以在建立物件時使用。你不能用一個值來做到這一點。 這是一個在模組上定義工廠的範例,以及一個取得工廠建立值注入的控制器:var myModule = angular.module("myModule", []); myModule.factory("myFactory", function() { return "a value"; }); myModule.controller("MyController", function($scope, myFactory) { console.log(myFactory); });如您所見,它與定義和注入值物件非常相似。請記住,注入的不是工廠函數,而是工廠函數產生的值。
#價值觀注入到工廠
您可以將值注入工廠。它的工作原理就像將值注入控制器一樣。以下是一個範例:var myModule = angular.module("myModule", []); myModule.value("numberValue", 999); myModule.factory("myFactory", function(numberValue) { return "a value: " + numberValue; });在這個範例中,注入的值用於建立由工廠函數建立的物件。
服務
AngularJS 中的服務是包含一組函數的單例 JavaScript 物件。這些函數包含服務執行其工作所需的任何邏輯。 AngularJS 服務是使用service()模組上的函數建立的。以下是一個例子:
function MyService() {this.doIt = function() {console.log("done");}} var myModule = angular.module("myModule", []); myModule.service("myService", MyService);如您所見,服務的定義與工廠和值有所不同。首先,服務被定義為一個單獨的命名函數。這是因為 AngularJS 中的服務是使用
new關鍵字建立的。因此,AngularJS 將在內部執行此操作:
var theService = new MyService();除了將服務定義為內部帶有函數的函數之外,您還可以將它們添加到AngularJS 中並將其與AngularJS 一起使用,就像使用值或函數一樣。您可以像這樣將服務注入控制器:
function MyService() { this.doIt = function() { console.log("done"); } } var myModule = angular.module("myModule", []); myModule.service("myService", MyService); myModule.controller("MyController", function($scope, myService) { myService.doIt(); });
#價值注入到服務
您可以將值注入服務,就像您可以將值注入控制器,或將服務注入控制器等。這是一個範例:var myModule = angular.module("myModule", []); myModule.value ("myValue" , "12345"); function MyService(myValue) { this.doIt = function() { console.log("done: " + myValue; } } myModule.service("myService", MyService);注意
MyService函數的參數是如何命名為與模組上註冊的值相同的。因此,該值將在創建時注入到服務中。
provider
AngularJS 中的提供者是您可以创建的最灵活的工厂形式。您可以像使用服务或工厂一样使用模块注册提供者,但您要使用该 provider()
函数。这是一个 AngularJS 提供程序示例:
var myModule = angular.module("myModule", []); myModule.provider("mySecondService", function() { var provider = {}; provider.$get = function() { var service = {}; service.doService = function() { console.log("mySecondService: Service Done!"); } return service; } return provider; });
如您所见,该provider()
函数采用 2 个参数。第一个参数是提供者创建的服务/对象的名称。在这种情况下,名称是mySecondService
。第二个参数是创建提供程序的函数。注意:提供者本身是一个工厂,因此此时没有从提供者创建实际的服务或对象。仅定义了创建提供程序的函数。
当您查看创建提供程序的函数时,您可以看到提供程序是一个 JavaScript 对象。
JavaScript 提供程序对象包含一个$get()
函数。这是提供者的工厂函数。换句话说,该$get()
函数会创建提供者创建的任何内容(服务、值等)。在上面的例子中,提供者创建了一个服务对象,其中包含一个名为 的服务函数(标准 JavaScript 函数)doService()
。
为了将提供者的产品注入控制器,请指定对提供者的依赖,就像使用服务一样。注入控制器的是提供者创建的产品,而不是提供者本身。这是一个 AngularJS 提供程序注入示例:
myModule.controller("MyController", function($scope, mySecondService ) { $scope.whenButtonClicked = function() { mySecondService.doIt(); } });
如您所见,提供者的名称用作控制器函数中的参数。提供者的$get()
函数创建的对象将被注入到这个参数中。
配置提供商
可以在模块的配置阶段通过调用其函数来进一步配置提供者。下面是一个例子:
var myModule = angular.module("myModule", []); myModule.provider("mySecondService", function() { var provider = {}; var config = { configParam : "default" }; provider.doConfig = function(configParam) { config.configParam = configParam; } provider.$get = function() { var service = {}; service.doService = function() { console.log("mySecondService: " + config.configParam); } return service; } return provider; }); myModule.config( function( mySecondServiceProvider ) { mySecondServiceProvider.doConfig("new config param"); }); myModule.controller("MyController", function($scope, mySecondService) { $scope.whenButtonClicked = function() { mySecondService.doIt(); } });
注意 provider 对象现在如何有一个名为 的额外函数doConfig()
。此函数可用于在提供程序上设置配置参数。
还要注意对myModule.config()
函数的调用。该config
函数接受一个函数作为参数。该函数可以配置模块。传递给的函数 config()
采用名为 的单个参数mySecondServiceProvider
。这与提供者注册的名称相同Provider
,后缀为 plus 。后缀告诉 AngularJS 注入提供者本身,而不是提供者创建的对象。在传递给config()
函数的mySecondServiceProvider.doConfig()
函数内部调用该函数,该函数在提供程序上设置 config 参数。
示例中稍后定义的控制器仅依赖于提供者创建的对象(而不是提供者本身)。它通过获取一个名为mySecondService
name 的参数来实现,该参数是服务提供者注册的名称。如您所见,从$scope.whenButtonClicked()
函数内部使用的服务 。
常数
在上一节有关提供程序的部分中,您看到了如何通过module.config()
函数配置提供程序。不幸的是,您不能将值注入到module.config()
函数中。相反,您可以注入常量。
AngularJS 中的常量是使用module.constants()
函数定义的。这是一个 AngularJS 常量示例:
myModule.constant("configValue", "constant config value");
这个常量现在可以module.config()
像这样注入到函数中:
myservices.config( function( mySecondServiceProvider, configValue ) { mySecondServiceProvider.doConfig(configValue); });
如您所见,该参数configValue
与常量的名称相匹配,该名称也是 configValue
. 因此常量的值将被注入到这个参数中。然后将常量值作为参数传递给提供程序doConfig()
上的函数 mySecondServiceProvider
。
模块之间的依赖关系
如您所见,值、工厂和服务被添加到 AngularJS 模块中。一个模块可以使用另一个模块的值、工厂和服务。为此,模块需要声明对包含它要使用的值、工厂和服务的模块的依赖关系。下面是一个例子:
var myUtilModule = angular.module("myUtilModule", []); myUtilModule.value("myValue", "12345"); var myOtherModule = angular.module("myOtherModule", [ 'myUtilModule' ]); myOtherModule.controller("MyController", function($scope, myValue ) { });
注意第二个模块 ( myOtherModule
)如何在myUtilModule
传递给angular.module()
函数的第二个参数(数组内部)中列出第一个模块 ( )的名称。这告诉 AngularJS 中定义的所有值、工厂和服务也myUtilModule
应该在myOtherModule
模块中可用。换句话说,myOtherModule
取决于 myUtilModule
。
其次,注意MyController
控制器函数现在如何声明一个名为 的参数myValue
。该值将从在myUtilModule
模块上注册的值提供。
微小的安全依赖注入AngularJS
当您缩小 JavaScript 时,JavaScript minifier 会用较短的名称替换局部变量和参数的名称。然而,AngularJS 使用控制器函数、工厂、服务和提供者的参数名称来决定将什么注入到他们的工厂函数中。如果名称更改,AngularJS 将无法注入正确的对象。
为了使您的 AngularJS 代码压缩安全,您需要提供要作为字符串注入的对象的名称。您将这些字符串与需要注入值的函数一起包装在一个数组中。这是一个 AngularJS 压缩安全依赖注入示例:
var myapp = angular.module("myapp", ['myservices']); myapp.controller("AController", ['$scope', function(p1) { p1.myvar = "the value"; }]);
本示例将$scope
对象注入到p1
控制器函数的参数中。
注意控制器函数是如何注册的。不是angular.controller
直接将控制器函数传递给函数,而是传递一个数组。该数组包含要注入控制器函数的值的名称,以及控制器函数本身。控制器函数始终是该数组中的最后一个值。如果需要注入多个值,则值名称列在数组的开头,并按它们要注入函数的顺序列出。这是一个缩小安全的多值示例:
var myapp = angular.module("myapp", ['myservices']); myapp.controller("AController", ['$scope', '$http', function(p1, p2) { p1.myvar = "the value"; p2.get("/myservice.json"); }]);
此示例将$scope
对象注入p1
参数,并将$http
服务注入p2
控制器函数的参数。
现在,控制器函数的参数名称不再重要。AngularJS 将使用数组开头的字符串来确定要注入到控制器函数中的内容。
相同的机制可用于工厂、服务和提供者,以提供缩小安全的依赖注入。这是一个小型化安全工厂、服务和提供程序示例:
var myutil = angular.module("myutil", []); myutil.value("safeValue", "a safe value"); myutil.factory("safeFactory", ['safeValue', function(p1) { return { value : p1 }; }]); function MySafeService(p1){ this.doIt = function() { return "MySafeService.doIt() called: " + p1.value; } } myutil.service("safeService", ['safeFactory', MySafeService]); myutil.provider("safeService2", function() { var provider = {}; provider.$get = ['safeService', function(p1) { var service = {}; service.doService = function() { console.log("safeService from provider: " + p1.doIt()); } return service; }]; return provider; }); myapp.controller("AController", ['$scope', 'safeService2', function(p1, p2) { p1.myvar = "the value"; p2.doService(); }]);
尤其要注意的provider的声明。注意,此时的依赖不会对provider工厂函数指定,但对$get()
从provider工厂函数内部返回的供应商的功能。实际上,使用具有依赖项名称和函数实现的数组而不仅仅是$get()
函数。
更多编程相关知识,请访问:编程视频!!
以上是深入了解AngularJS中的模組化與依賴注入的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Python和JavaScript在社區、庫和資源方面的對比各有優劣。 1)Python社區友好,適合初學者,但前端開發資源不如JavaScript豐富。 2)Python在數據科學和機器學習庫方面強大,JavaScript則在前端開發庫和框架上更勝一籌。 3)兩者的學習資源都豐富,但Python適合從官方文檔開始,JavaScript則以MDNWebDocs為佳。選擇應基於項目需求和個人興趣。

從C/C 轉向JavaScript需要適應動態類型、垃圾回收和異步編程等特點。 1)C/C 是靜態類型語言,需手動管理內存,而JavaScript是動態類型,垃圾回收自動處理。 2)C/C 需編譯成機器碼,JavaScript則為解釋型語言。 3)JavaScript引入閉包、原型鍊和Promise等概念,增強了靈活性和異步編程能力。

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

JavaScript在現實世界中的應用包括服務器端編程、移動應用開發和物聯網控制:1.通過Node.js實現服務器端編程,適用於高並發請求處理。 2.通過ReactNative進行移動應用開發,支持跨平台部署。 3.通過Johnny-Five庫用於物聯網設備控制,適用於硬件交互。

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務

本文展示了與許可證確保的後端的前端集成,並使用Next.js構建功能性Edtech SaaS應用程序。 前端獲取用戶權限以控制UI的可見性並確保API要求遵守角色庫

JavaScript是現代Web開發的核心語言,因其多樣性和靈活性而廣泛應用。 1)前端開發:通過DOM操作和現代框架(如React、Vue.js、Angular)構建動態網頁和單頁面應用。 2)服務器端開發:Node.js利用非阻塞I/O模型處理高並發和實時應用。 3)移動和桌面應用開發:通過ReactNative和Electron實現跨平台開發,提高開發效率。

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

SublimeText3 Linux新版
SublimeText3 Linux最新版

Dreamweaver CS6
視覺化網頁開發工具

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中