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

Angular2 多級注入器詳解及實例

 更新時間:2016年10月30日 09:47:53   投稿:lqh  
這篇文章主要介紹了Angular2 多級注入器詳解的相關(guān)資料,并附簡單實例代碼,需要的朋友可以參考下

angular2 的依賴注入包含了太多的內(nèi)容,其中的一個重點就是注入器,而注入器又非常難理解,今天我們不深入介紹注入器的內(nèi)容,可以參考官方文檔,我們今天來說注入器的層級。

也就是組件獲取服務(wù)的容器會選擇具體哪一個。

先簡單介紹一個背景:有3個組件AppComponent 根組件、DetailList組件 ( 日志列表組件)、Detail組件( 日志組件)。

這三個組件會形成一個組件樹,對應(yīng)的我們也可以認(rèn)為每個組件都會有一個獨立的注入器(有時候不會出現(xiàn),但是可以這么認(rèn)為)。

加入一個日志服務(wù)LoggerService,如果按照我們普通的入門方式,在根模塊providers 中提供LoggerService。那么在整個應(yīng)用程序中,LoggerService只有一個實例,什么意思呢?就是說無論在哪個組件,獲取到的都是首次創(chuàng)建的LoggerService,所有組件共用一個服務(wù)實例,這有時候會是一個有用的特性,比如我們使用的全局配置。

全局唯一不是我們這次要驗證的重點,因為這個太普通,我們這次要說明的是我們?nèi)绾卧诿總€組件中都獲取單獨的LoggerService實例,即每個組件的實例都不同。這個就需要對ng2的依賴注入有所了解才可以。

我們逐步來說明如何實現(xiàn)?

為了便于看到這篇短文的同學(xué)有所了解,我加入一些基礎(chǔ)代碼。

1.app.module.ts 應(yīng)用程序根模塊。注意此處我們沒有在Providers中注冊loggerService。當(dāng)然注冊了通過后面的方法也可以達(dá)到我們的目的。

import { NgModule, Optional, SkipSelf, ReflectiveInjector} from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';

/* App Root */
import { AppComponent } from './app.component';
import { routing } from './app.routing';
import { Title } from '@angular/platform-browser';
import {MessagesModule, GrowlModule, ButtonModule}from 'primeng/primeng';
import {AppDetailComponent}from './app-detail.component';
import {AppDetailListComponent}from './app-detailList.component';
import {LoggerService}from './logger.service';
let allTitle:string="郭志奇";

@NgModule({
 imports: [
 BrowserModule,
 MessagesModule,
 GrowlModule, ButtonModule
 ],
 declarations: [AppComponent, AppDetailComponent, AppDetailListComponent],//聲明當(dāng)前模塊需要的指定 組件信息
 exports: [],
 providers: [Title],
 bootstrap: [AppComponent]
})
export class AppModule {
 constructor( @Optional() @SkipSelf() parentModule: AppModule) {
 console.log(parentModule);
 if (parentModule) {
  throw new Error(
  'AppModule is already loaded. Import it in the AppModule only');
 }
 }
}

2.app.component.ts  應(yīng)用程序根組件

import { Component, ViewEncapsulation, Host, ViewContainerRef, ReflectiveInjector } from '@angular/core';
import { Title } from '@angular/platform-browser';
import { Message } from 'primeng/primeng';
import {LoggerService}from './logger.service';
@Component({
 selector: 'my-app',
 moduleId: module.id,
 templateUrl: './app.component.html',
 providers: [
  { provide: LoggerService, useClass: LoggerService }
 ]
})
export class AppComponent {
 subtitle = '(Final)';
 private msgs: Message[];
 constructor(private title: Title, @Host() private logger: LoggerService) {
  this.title.setTitle("AppComponent");
 }

 show(): void {
  this.logger.Debug();
 }
}

請注意,我們在跟組件中providers中注冊了LoggerService。

3.app.detailList.ts  日志列表中providers中也注冊了LoggerService

import {Component, Host}from '@angular/core';
import {LoggerService}from './logger.service';

@Component({
 selector: 'my-detailList',
 templateUrl: './app-detailList.component.html',
 moduleId: module.id,
 providers: [
  { provide: LoggerService, useClass: LoggerService }
 ]
})

export class AppDetailListComponent {
 constructor( private logger: LoggerService) {

 }
 show(): void {
  this.logger.Debug();
 }

}

 4.app.detail.ts  日志組件providers沒有注冊LoggerService。

import {Component, Host}from '@angular/core';
import {LoggerService}from './logger.service';
@Component({
 selector: 'detail',
 moduleId: module.id,
 templateUrl: './app-detail.component.html',
 providers: [
  // { provide: LoggerService, useClass: LoggerService }
 ]
})

export class AppDetailComponent {
 constructor( private logger: LoggerService) {

 }
 show(): void {
  this.logger.Debug();
 }

}

 現(xiàn)在我們通過chrome來看一下 LoggerService的層級關(guān)系。

 

通過查看依賴關(guān)系圖,我們可以看到AppComponent組件使用了單獨的LoggerService,DetailList組件也使用單獨的LoggerService 實例,而Detail組件使用的是父組件DetailList的LoggerService實例。

目前來看沒有達(dá)到我們的要求,我們的要求是每個組件都有單獨的LoggerService實例,那么我們假設(shè)Detail組件的providers是我們忘記輸入的,很難測試出原因所在。那么我們加入一個@Host()來限制注入器的查找范圍。

對于注入器的向上查找方式,請參考官方文檔。

為了便于調(diào)試,我們加入@Host().

@Host 裝飾器將把往上搜索的行為截止在 宿主組件

detail.ts 提示detail組件加入@Host()裝飾器

import {Component, Host}from '@angular/core';
import {LoggerService}from './logger.service';
@Component({
 selector: 'detail',
 moduleId: module.id,
 templateUrl: './app-detail.component.html',
 providers: [
  // { provide: LoggerService, useClass: LoggerService }
 ]
})

export class AppDetailComponent {
 constructor( @Host() private logger: LoggerService) {

 }
 show(): void {
  this.logger.Debug();
 }

}

會提示找不到LoggerService的實例,@Host()的作用就是限制注入器查找到當(dāng)前組件就停止,不會繼續(xù)往上查找。所以會出現(xiàn)找不到Providers的錯誤。

加上providers 的結(jié)果就是我們想要的了。

 

完美的解決了多組件使用單獨服務(wù)實例的問題。

 總結(jié):

1.如果要使組件單獨使用服務(wù),那么首先要在providers 中單獨注冊該服務(wù)。很容易理解

2.為了更好的檢測可能出現(xiàn)的問題,在組件服務(wù)上加入@Host()裝飾器,可以盡量早的拋出錯誤信息

3.使用ng2的debug工具

4.要明確各組件之間的關(guān)系,因為不同的組件關(guān)系會導(dǎo)致服務(wù)的實例的不同

5.服務(wù)盡量是模塊級,不是應(yīng)用級。

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關(guān)文章

  • angular中的post請求處理示例詳解

    angular中的post請求處理示例詳解

    這篇文章主要給大家介紹了關(guān)于angular中post請求處理的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者使用angular具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • 模板視圖和AngularJS之間沖突的解決方法

    模板視圖和AngularJS之間沖突的解決方法

    這篇文章主要介紹了模板視圖和AngularJS之間沖突的解決方法,結(jié)合實例形式分析了AngularJS模板視圖沖突的原因并給出了2種解決方法供大家參考使用,需要的朋友可以參考下
    2016-11-11
  • AngularJs  Understanding Angular Templates

    AngularJs Understanding Angular Templates

    本文主要介紹AngularJs Understanding Angular Templates的資料,這里整理了詳細(xì)的資料及簡單示例代碼,有興趣的小伙伴的參考下
    2016-09-09
  • 詳解Angular路由之路由守衛(wèi)

    詳解Angular路由之路由守衛(wèi)

    這篇文章主要介紹了詳解Angular路由之路由守衛(wèi),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • 基于Angular中ng-controller父子級嵌套的相關(guān)屬性詳解

    基于Angular中ng-controller父子級嵌套的相關(guān)屬性詳解

    今天小編就為大家分享一篇基于Angular中ng-controller父子級嵌套的相關(guān)屬性詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • Angular2 組件交互實例詳解

    Angular2 組件交互實例詳解

    Angular2應(yīng)用程序?qū)嶋H上是有很多父子組價組成的組件樹,因此,了解組件之間如何通信,特別是父子組件之間,對編寫Angular2應(yīng)用程序具有十分重要的意義。下面通過本文給大家介紹Angular2 組件交互知識,感興趣的朋友一起看看吧
    2017-08-08
  • angular2系列之路由轉(zhuǎn)場動畫的示例代碼

    angular2系列之路由轉(zhuǎn)場動畫的示例代碼

    本篇文章主要介紹了angular2系列之路由轉(zhuǎn)場動畫的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • Angular實現(xiàn)類似博客評論的遞歸顯示及獲取回復(fù)評論的數(shù)據(jù)

    Angular實現(xiàn)類似博客評論的遞歸顯示及獲取回復(fù)評論的數(shù)據(jù)

    這篇文章主要給大家介紹了關(guān)于Angular如何實現(xiàn)類似博客評論的遞歸顯示及獲取回復(fù)評論的數(shù)據(jù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11
  • 在AngularJs中設(shè)置請求頭信息(headers)的方法及不同方法的比較

    在AngularJs中設(shè)置請求頭信息(headers)的方法及不同方法的比較

    在AngularJs中有三種方式可以設(shè)置請求頭信息,文中對每種方法給大家介紹的非常詳細(xì),選擇那種方式可以根據(jù)自己的需求,感興趣的朋友跟隨腳本之家小編一起看看吧
    2018-09-09
  • 使用AngularJS 應(yīng)用訪問 Android 手機(jī)的圖片庫

    使用AngularJS 應(yīng)用訪問 Android 手機(jī)的圖片庫

    這篇文章主要介紹了使用AngularJS 應(yīng)用訪問 Android 手機(jī)的圖片庫的相關(guān)資料,需要的朋友可以參考下
    2015-03-03

最新評論

兖州市| 陕西省| 五峰| 普陀区| 贵阳市| 惠来县| 孙吴县| 甘谷县| 崇明县| 咸阳市| 栾川县| 长海县| 两当县| 黄梅县| 和硕县| 漯河市| 搜索| 梧州市| 平利县| 静海县| 宜章县| 盈江县| 泾川县| 吉木萨尔县| 丘北县| 休宁县| 资溪县| 东源县| 英山县| 习水县| 来凤县| 原阳县| 平邑县| 光泽县| 乐陵市| 成武县| 乌拉特后旗| 都江堰市| 宁河县| 满城县| 浦北县|