最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Angular 4依賴注入學(xué)習(xí)教程之Injectable裝飾器(六)

 更新時(shí)間:2017年06月04日 10:16:25   作者:semlinker  
這篇文章主要給大家介紹了關(guān)于Angular 4依賴注入之Injectable裝飾器的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)跟著小編一起學(xué)習(xí)學(xué)習(xí)吧。

學(xué)習(xí)目錄

本文主要給大家介紹的是關(guān)于Angular 4依賴注入之Injectable裝飾器的相關(guān)內(nèi)容,分享出來(lái)供大家參考學(xué)習(xí),下面來(lái)看看詳細(xì)的介紹:

本系列教程的開(kāi)發(fā)環(huán)境及開(kāi)發(fā)語(yǔ)言:

基礎(chǔ)知識(shí)

裝飾器是什么

  • 它是一個(gè)表達(dá)式
  • 該表達(dá)式被執(zhí)行后,返回一個(gè)函數(shù)
  • 函數(shù)的入?yún)⒎謩e為 targe、name 和 descriptor
  • 執(zhí)行該函數(shù)后,可能返回 descriptor 對(duì)象,用于配置 target 對(duì)象 

裝飾器的分類

  • 類裝飾器 (Class decorators)
  • 屬性裝飾器 (Property decorators)
  • 方法裝飾器 (Method decorators)
  • 參數(shù)裝飾器 (Parameter decorators)

TypeScript 類裝飾器

類裝飾器聲明:

declare type ClassDecorator = <TFunction extends Function>(target: TFunction) => 
 TFunction | void

類裝飾器顧名思義,就是用來(lái)裝飾類的。它接收一個(gè)參數(shù):

target: TFunction - 被裝飾的類

看完第一眼后,是不是感覺(jué)都不好了。沒(méi)事,我們馬上來(lái)個(gè)例子:

function Greeter(target: Function): void {
 target.prototype.greet = function (): void {
 console.log('Hello!');
 }
}

@Greeter
class Greeting {
 constructor() { // 內(nèi)部實(shí)現(xiàn) }
}

let myGreeting = new Greeting();
myGreeting.greet(); // console output: 'Hello!';

上面的例子中,我們定義了 Greeter 類裝飾器,同時(shí)我們使用了 @Greeter 語(yǔ)法,來(lái)使用裝飾器。

Injectable 類裝飾器使用

import { Injectable } from '@angular/core';

@Injectable()
class HeroService {}

Injectable 裝飾器

在介紹 Injectable 裝飾器前,我們先來(lái)回顧一下 HeroComponent 組件:

@Component({
 selector: 'app-hero',
 template: `
 <ul>
 <li *ngFor="let hero of heros">
 ID: {{hero.id}} - Name: {{hero.name}}
 </li>
 </ul>
 `
})
export class HeroComponent implements OnInit {
 heros: Array<{ id: number; name: string }>;

 constructor(private heroService: HeroService,
 private loggerService: LoggerService) { }

 ngOnInit() {
 this.loggerService.log('Fetching heros...');
 this.heros = this.heroService.getHeros();
 }
}

在 HeroComponent 組件的 ngOnInit 生命周期鉤子中,我們?cè)讷@取英雄信息前輸出相應(yīng)的調(diào)試信息。其實(shí)為了避免在每個(gè)應(yīng)用的組件中都添加 log 語(yǔ)句,我們可以把 log 語(yǔ)句放在 getHeros() 方法內(nèi)。

更新前 HeroService 服務(wù)

export class HeroService {
 heros: Array<{ id: number; name: string }> = [
 { id: 11, name: 'Mr. Nice' },
 { id: 12, name: 'Narco' },
 { id: 13, name: 'Bombasto' },
 { id: 14, name: 'Celeritas' },
 { id: 15, name: 'Magneta' },
 { id: 16, name: 'RubberMan' },
 { id: 17, name: 'Dynama' },
 { id: 18, name: 'Dr IQ' },
 { id: 19, name: 'Magma' },
 { id: 20, name: 'Tornado' }
 ];

 getHeros() {
 return this.heros;
 }
}

更新后 HeroService 服務(wù)

import { LoggerService } from './logger.service';

export class HeroService {
 constructor(private loggerService: LoggerService) { }

 heros: Array<{ id: number; name: string }> = [
 { id: 11, name: 'Mr. Nice' },
 { id: 12, name: 'Narco' },
 { id: 13, name: 'Bombasto' },
 { id: 14, name: 'Celeritas' },
 { id: 15, name: 'Magneta' }
 ];

 getHeros() {
 this.loggerService.log('Fetching heros...');
 return this.heros;
 }
}

當(dāng)以上代碼運(yùn)行后會(huì)拋出以下異常信息:

Uncaught Error: Can't resolve all parameters for HeroService: (?).

上面異常信息說(shuō)明無(wú)法解析 HeroService 的所有參數(shù),而 HeroService 服務(wù)的構(gòu)造函數(shù)如下:

export class HeroService {
 constructor(private loggerService: LoggerService) { }
}

該構(gòu)造函數(shù)的輸入?yún)?shù)是 loggerService 且它的類型是 LoggerService 。在繼續(xù)深入研究之前,我們來(lái)看一下 HeroService 最終生成的 ES5 代碼:

var HeroService = (function() {
 function HeroService(loggerService) {
 this.loggerService = loggerService;
 this.heros = [{...}, ...];
 }
 HeroService.prototype.getHeros = function() {
 this.loggerService.log('Fetching heros...');
 return this.heros;
 };
 return HeroService;
}());

我們發(fā)現(xiàn)生成的 ES5 代碼中,HeroService 構(gòu)造函數(shù)中是沒(méi)有包含任何類型信息的,因此 Angular Injector (注入器) 就無(wú)法正常工作了。那么要怎么保存 HeroService 類構(gòu)造函數(shù)中參數(shù)的類型信息呢?相信你已經(jīng)想到了答案 — 當(dāng)然是使用 Injectable 裝飾器咯。接下來(lái)我們更新一下 HeroService:

import { Injectable } from '@angular/core';
import { LoggerService } from './logger.service';

@Injectable()
export class HeroService {
 // ...
}

更新完上面的代碼,成功保存后,在 http://localhost:4200/ 頁(yè)面,你將看到熟悉的 "身影":

ID: 11 - Name: Mr. Nice
ID: 12 - Name: Narco
ID: 13 - Name: Bombasto
ID: 14 - Name: Celeritas
ID: 15 - Name: Magneta

現(xiàn)在我們?cè)賮?lái)看一下 HeroService 類生成的 ES5 代碼:

var HeroService = (function() {
 function HeroService(loggerService) {
 this.loggerService = loggerService;
 this.heros = [{...}, ...];
 }
 HeroService.prototype.getHeros = function() {
 this.loggerService.log('Fetching heros...');
 return this.heros;
 };
 return HeroService;
}());
HeroService = __decorate([__webpack_require__.i(
 __WEBPACK_IMPORTED_MODULE_0__angular_core__["c"/* Injectable */
])(), __metadata("design:paramtypes", ...)], HeroService);

__decorate 函數(shù)

var __decorate = (this && this.__decorate) || function(decorators, target, key, desc) {...};

__metadata 函數(shù)

var __metadata = (this && this.__metadata) || function(k, v) {
 if (typeof Reflect === "object" && typeof Reflect.metadata === "function")
 return Reflect.metadata(k, v);
};

我們發(fā)現(xiàn)相比未使用 Injectable 裝飾器,HeroService 服務(wù)生成的 ES5 代碼多出了 HeroService = __decorate(...) 這些代碼。簡(jiǎn)單起見(jiàn),我稍微介紹一下,通過(guò) Injectable 裝飾器,在編譯時(shí)會(huì)把 HeroService 服務(wù)構(gòu)造函數(shù)中參數(shù)的類型信息,通過(guò) Reflect API 保存在 window['__core-js_shared__'] 對(duì)象的內(nèi)部屬性中。當(dāng) Injector 創(chuàng)建 HeroService 對(duì)象時(shí),會(huì)通過(guò) Reflect API 去讀取之前已保存的構(gòu)造函數(shù)中參數(shù)的類型信息,進(jìn)而正確的完成實(shí)例化操作。

我有話說(shuō)

@Injectable() 是必須的么?

如果所創(chuàng)建的服務(wù)不依賴于其他對(duì)象,是可以不用使用 Injectable 類裝飾器。但當(dāng)該服務(wù)需要在構(gòu)造函數(shù)中注入依賴對(duì)象,就需要使用 Injectable 裝飾器。不過(guò)比較推薦的做法不管是否有依賴對(duì)象,在創(chuàng)建服務(wù)時(shí)都使用 Injectable 類裝飾器。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者使用Angular 4能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • AngularJS中取消對(duì)HTML片段轉(zhuǎn)義的方法例子

    AngularJS中取消對(duì)HTML片段轉(zhuǎn)義的方法例子

    這篇文章主要介紹了AngularJS中取消對(duì)HTML片段轉(zhuǎn)義的方法例子,在一些需要顯示HTML的地方,就要取消AngularJS的轉(zhuǎn)義,本文就介紹了這種方法,需要的朋友可以參考下
    2015-01-01
  • angularjs實(shí)現(xiàn)天氣預(yù)報(bào)功能

    angularjs實(shí)現(xiàn)天氣預(yù)報(bào)功能

    這篇文章主要為大家詳細(xì)介紹了angularjs實(shí)現(xiàn)天氣預(yù)報(bào)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • AngularJS 輸入驗(yàn)證詳解及實(shí)例代碼

    AngularJS 輸入驗(yàn)證詳解及實(shí)例代碼

    本文主要介紹AngularJS 輸入驗(yàn)證,這里對(duì)AngularJS 輸入驗(yàn)證的資料做了整理,并附簡(jiǎn)單實(shí)例代碼和效果圖,有需要的小伙伴參考下
    2016-07-07
  • AngularJS實(shí)現(xiàn)多級(jí)下拉框

    AngularJS實(shí)現(xiàn)多級(jí)下拉框

    這篇文章主要為大家詳細(xì)介紹了AngularJS實(shí)現(xiàn)多級(jí)下拉框,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 學(xué)習(xí)AngularJs:Directive指令用法(完整版)

    學(xué)習(xí)AngularJs:Directive指令用法(完整版)

    這篇文章主要學(xué)習(xí)AngularJs:Directive指令用法,內(nèi)容很全面,感興趣的小伙伴們可以參考一下
    2016-04-04
  • AngularJS表單編輯提交功能實(shí)例

    AngularJS表單編輯提交功能實(shí)例

    這篇文章主要介紹了AngularJS表單編輯提交功能實(shí)例,本文講解如何修改表單的默認(rèn)值,需要的朋友可以參考下
    2015-02-02
  • 詳解如何在Angular應(yīng)用中發(fā)起HTTP?302 redirect

    詳解如何在Angular應(yīng)用中發(fā)起HTTP?302 redirect

    這篇文章主要介紹了如何在Angular應(yīng)用中發(fā)起HTTP 302 redirect詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • 對(duì)angularjs框架下controller間的傳值方法詳解

    對(duì)angularjs框架下controller間的傳值方法詳解

    今天小編就為大家分享一篇對(duì)angularjs框架下controller間的傳值方法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10
  • 對(duì)Angular中單向數(shù)據(jù)流的深入理解

    對(duì)Angular中單向數(shù)據(jù)流的深入理解

    這篇文章主要給大家介紹了關(guān)于對(duì)Angular中單向數(shù)據(jù)流的深入理解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-03-03
  • 詳解AngularJS controller調(diào)用factory

    詳解AngularJS controller調(diào)用factory

    本篇文章主要介紹了詳解AngularJS controller調(diào)用factory,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05

最新評(píng)論

吉木萨尔县| 崇信县| 辽宁省| 丰城市| 巴青县| 裕民县| 饶阳县| 晋中市| 海宁市| 余庆县| 寿光市| 新建县| 鄂伦春自治旗| 富源县| 哈密市| 甘德县| 河西区| 贵德县| 泸州市| 全椒县| 闸北区| 德钦县| 郯城县| 松桃| 连州市| 偏关县| 贡觉县| 阿拉善盟| 安福县| 邳州市| 西畴县| 嘉鱼县| 苏尼特右旗| 林西县| 峡江县| 井研县| 石景山区| 灌阳县| 南岸区| 涿州市| 灌云县|