依賴注入是一個(gè)用來管理代碼依賴的強(qiáng)大模式。
依賴注入是一種將對(duì)象作為應(yīng)用程序中不同組件中的依賴關(guān)系傳遞的設(shè)計(jì)模式。 它創(chuàng)建一個(gè)新的類實(shí)例及其所需的依賴項(xiàng)。 依賴注入被刺激到框架中,并且可以在任何地方使用。
使用依賴注入時(shí),必須記住以下幾點(diǎn):
注入器機(jī)制維護(hù)服務(wù)實(shí)例,并且可以使用提供者創(chuàng)建。
提供者是創(chuàng)建服務(wù)的一種方式。
您可以與注入器一起注冊(cè)提供程序。
下面的例子描述了在Angular 2中使用依賴注入:
<!DOCTYPE html> <html> <head> <title>Angular 2 Dependency Injection</title> <script src="https://atts.w3cschool.cn/attachments/tuploads/angular2/es6-shim.min.js"></script> <script src="https://atts.w3cschool.cn/attachments/tuploads/angular2/system-polyfills.js"></script> <script src="https://atts.w3cschool.cn/attachments/tuploads/angular2/angular2-polyfills.js"></script> <script src="https://atts.w3cschool.cn/attachments/tuploads/angular2/system.js"></script> <script src="https://atts.w3cschool.cn/attachments/tuploads/angular2/typescript.js"></script> <script src="https://atts.w3cschool.cn/attachments/tuploads/angular2/Rx.js"></script> <script src="https://atts.w3cschool.cn/attachments/tuploads/angular2/angular2.dev.js"></script> <script> System.config({ transpiler: 'typescript', typescriptOptions: { emitDecoratorMetadata: true }, packages: {'app': {defaultExtension: 'ts'}} }); System.import('/angular2/src/app/dependency_injection_main') .then(null, console.error.bind(console)); </script> </head> <body> <my-app>Loading...</my-app> </body> </html>
上述代碼包括以下配置選項(xiàng):
您可以使用typescript版本配置index.html文件。在使用transpiler選項(xiàng)運(yùn)行應(yīng)用程序之前,SystemJS將TypeScript轉(zhuǎn)換為JavaScript。
如果在運(yùn)行應(yīng)用程序之前沒有翻譯到JavaScript,您可能會(huì)看到瀏覽器中隱藏的編譯器警告和錯(cuò)誤。
當(dāng)設(shè)置emitDecoratorMetadata選項(xiàng)時(shí),TypeScript會(huì)為代碼的每個(gè)類生成元數(shù)據(jù)。如果不指定此選項(xiàng),將生成大量未使用的元數(shù)據(jù),這會(huì)影響文件大小和對(duì)應(yīng)用程序運(yùn)行時(shí)的影響。
Angular 2包括來自app文件夾的包,其中文件將具有.ts擴(kuò)展名。
接下來它將從應(yīng)用程序文件夾加載主組件文件。如果沒有找到主要組件文件,那么它將在控制臺(tái)中顯示錯(cuò)誤。
當(dāng)Angular調(diào)用main.ts中的引導(dǎo)函數(shù)時(shí),它讀取Component元數(shù)據(jù),找到“app”選擇器,找到一個(gè)名為app的元素標(biāo)簽,并在這些標(biāo)簽之間加載應(yīng)用程序。
讓我們創(chuàng)建TypeScript(.ts)文件并將它們保存在app文件夾中。
dependency_injection_main.tsimport {bootstrap} from 'angular2/platform/browser'; //importing bootstrap function import {AppComponent} from "./fruit-component"; //importing component function bootstrap(AppComponent);fruit-component.ts
import {Component} from 'angular2/core'; import {MyListComponent} from './play-component'; //@Component is a decorator that uses configuration object to create the component and its view. @Component({ selector: 'my-app', //The selector creates an instance of the component where it finds 'my-app' tag in parent HTML template:`<my-list></my-list>`, directives:[MyListComponent] //'MyListComponent' is the root component of fruits that governs child components }) export class AppComponent { }play-component.ts
import {Component} from "angular2/core"; import {FruitService} from "./fruits.service"; import {Fruits} from "./fruits"; import {OnInit} from "angular2/core"; @Component({ selector: "my-list", template: ` List of Fruits<br> <ul> <li *ngFor="#list of fruits"> //The NgFor directive instantiates a template once per item from an iterable {{list.id}} - {{ list.name }} </li> </ul> `, providers: [FruitService] //providers are part of @Component metadata }) //The 'MyListComponent' should get list of fruits from the injected 'FruitService' export class MyListComponent implements OnInit { public fruits : Country[]; //Using constructor, call the _fruitService and populate the fruits list constructor(private _fruitService: FruitService) {} getContacts(){ this._fruitService.getContacts().then((fruits: Country[]) => this.fruits = fruits); } //The 'ngOnInit()' hook is called when done with creating the component and evaluated the inputs ngOnInit():any{ this.getContacts(); } }fruits.service.ts
import {Injectable} from "angular2/core"; import {COUNTRIES} from "./fruits.lists"; //It is used for meta data generation and specifies that class is available to an injector for instantiation @Injectable() //'FruitService' exposes 'getContacts()' method that returns list of data export class FruitService { getContacts() { return Promise.resolve(COUNTRIES); // takes values from fruits.lists.ts file } }fruits.lists.ts
import {Fruits} from "./fruits"; //storing array of data in Fruits export const COUNTRIES: Fruits[] =[ {"id": 1, name :"Apple"}, {"id": 2, name: "Grapes"}, {"id": 3, name: "Orange"}, {"id": 4, name: "Banana"} ];fruits.ts
export interface Fruits{ id: number; name: string; }
讓我們執(zhí)行以下步驟,看看上面的代碼如何工作:
將上面的HTML代碼保存為index.html文件,如同我們?cè)?a href="http://hgci.cn/angular2/angular2_environment.html" target="_blank">環(huán)境章節(jié)中創(chuàng)建的,并使用上面的包含.ts文件的應(yīng)用程序文件夾。
打開終端窗口并輸入以下命令:
npm start
稍后,瀏覽器選項(xiàng)卡應(yīng)打開并顯示輸出,如下所示。
或者你可以用另一種方式運(yùn)行這個(gè)文件:
將以上HTML代碼作為angular2_dependency_injection.html文件保存在服務(wù)器根文件夾中。
將此HTML文件打開為http://localhost/angular2_dependency_injection.html,并顯示如下所示的輸出。
更多建議: