angular6 依赖注入 ——学习笔记

文件目录:


product1.component.html:

<div>
	<h1>商品详情</h1>
	<h2>名称:{{product.title}}</h2>
	<h2>价格:{{product.price}}</h2>
	<h2>描述:{{product.desc}}</h2>
</div>

product1.component.ts

import { Component, OnInit } from '@angular/core';
import {Product, ProductService } from '../share/product.service';
@Component({
  selector: 'app-product1',
  templateUrl: './product1.component.html',
  styleUrls: ['./product1.component.css']
})
export class Product1Component implements OnInit {
	product: Product;
  constructor(private productService:ProductService) {
  	
  }
		
  ngOnInit() {
  	this.product = this.productService.getProduct();
  }

}

product2.component.html

<div>
	<h1>商品详情</h1>
	<h2>名称:{{product.title}}</h2>
	<h2>价格:{{product.price}}</h2>
	<h2>描述:{{product.desc}}</h2>
</div>

product2.component.ts

import { Component, OnInit } from '@angular/core';
import {Product, ProductService } from '../share/product.service';
import {AnotherProductService } from '../share/anotherproduct.service';
@Component({
  selector: 'app-product2',
  templateUrl: './product2.component.html',
  styleUrls: ['./product2.component.css'],
  providers:[
  {provide:ProductService, useClass:AnotherProductService}
  ]
})
export class Product2Component implements OnInit {

  product: Product;
  constructor(private productService:ProductService) {
  	
  }
		
  ngOnInit() {
  	this.product = this.productService.getProduct();
  }

}

product.service.ts

import { Injectable } from '@angular/core';
import { LoggerService } from './logger.service'
@Injectable({
  providedIn: 'root'
})
export class ProductService {

  constructor(private logger:LoggerService) { }
  
  getProduct(): Product {
  	this.logger.log('getProduct方法被调用');
    return new Product(0, 'iPhone7', 5899, '最新款苹果手机');
  }
}

export class Product {
  constructor(
  	public id: number, 
  	public title: string, 
  	public price: number, 
  	public desc: string) {
  		
  	}
}

anotherproduct.service.ts

import { Injectable } from '@angular/core';
import {Product, ProductService } from './product.service';
import { LoggerService } from './logger.service'
@Injectable({
  providedIn: 'root'
})
export class AnotherProductService {
	
	getProduct(): Product {
    return new Product(1, 'sumsung', 3899, '最新款三星手机');
  }
  constructor(logger:LoggerService) { }
}

logger.service.ts

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

@Injectable({
  providedIn: 'root'
})
export class LoggerService {

  constructor() { }
  
  log(message:string){
  	console.log(message)
  }
}

app.module.ts

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';

import { AppComponent } from './app.component';
import { Product1Component } from './product1/product1.component';
import {ProductService } from './share/product.service';
import { LoggerService } from './share/logger.service'
import { Product2Component } from './product2/product2.component';
@NgModule({
  declarations: [
    AppComponent,
    Product1Component,
    Product2Component
  ],
  imports: [
    BrowserModule
  ],
  providers: [ProductService,LoggerService],
  bootstrap: [AppComponent]
})
export class AppModule { }

得到的页面



二.使用工厂和值提供器

把product2.component.ts中的provider属性去掉

import { Component, OnInit } from '@angular/core';
import {Product, ProductService } from '../share/product.service';
import {AnotherProductService } from '../share/anotherproduct.service';
@Component({
  selector: 'app-product2',
  templateUrl: './product2.component.html',
  styleUrls: ['./product2.component.css'],
})
export class Product2Component implements OnInit {

  product: Product;
  constructor(private productService:ProductService) {
  	
  }
		
  ngOnInit() {
  	this.product = this.productService.getProduct();
  }

}
app.module.ts
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';

import { AppComponent } from './app.component';
import { Product1Component } from './product1/product1.component';
import {ProductService, Product } from './share/product.service';
import { LoggerService } from './share/logger.service';
import { AnotherProductService } from './share/anotherproduct.service';
import { Product2Component } from './product2/product2.component';
@NgModule({
  declarations: [
    AppComponent,
    Product1Component,
    Product2Component
  ],
  imports: [
    BrowserModule
  ],
 providers: [{
    provide: ProductService,
    useFactory: (logger:LoggerService) => {
      const dev = Math.random() > 0.5;
      if (dev) {
        return new ProductService(logger);
      } else {
        return new AnotherProductService(logger);
      }
    },
    deps:[LoggerService]
  },LoggerService],
  bootstrap: [AppComponent]
})
export class AppModule { }

结果:上下两个组件的内容完全相同。工厂模式返回的是单一实例,共享同一个实例


值提供器:

app.module.ts

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';

import { AppComponent } from './app.component';
import { Product1Component } from './product1/product1.component';
import {ProductService, Product } from './share/product.service';
import { LoggerService } from './share/logger.service';
import { AnotherProductService } from './share/anotherproduct.service';
import { Product2Component } from './product2/product2.component';
@NgModule({
  declarations: [
    AppComponent,
    Product1Component,
    Product2Component
  ],
  imports: [
    BrowserModule
  ],
 providers: [{
    provide: ProductService,
    useFactory: (logger:LoggerService,appConfig) => {
      const dev = Math.random() > 0.5;
      if (appConfig.isDev) {
        return new ProductService(logger);
      } else {
        return new AnotherProductService(logger);
      }
    },
    deps:[LoggerService,"APP_CONFIG"]
  },LoggerService,
	 {
	    provide:"APP_CONFIG",
	    useValue:{isDev:false}
	  }],
  bootstrap: [AppComponent]
})
export class AppModule { }

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值