Angular data7

新建路由配置

在app.module.ts中配置

....
import {RouterModule, Routes} from "@angular/router";

const routeConfig:Routes = [
  {path:'',component:HomeComponent},
  {path:'product/:prodTitle',component:ProductDetailComponent}
]
....
imports: [
    BrowserModule,
    RouterModule.forRoot(routeConfig)
  ],

依赖注入“自动处理对象的创建过程”

image.png

开始新的例子

1、新建Inject 项目

 ng new Inject

2、新建product1组件

 ng g component product1

3、新建服务

ng g service shared/product

1、在app.module.ts模块中提供器providers 定义ProductService对象
2、在productService中定义Product对象,在productService的控制的中构造方法中定义getProduct()方法用来返回实例化后的Product对象
3、在product1组件中定义product变量,类型为Product对象,用于模块渲染
4、在product1组件中的构造方法,注入ProductService对象
5、在product1组件的ngOnInit函数中给product变量赋值,通过调用ProductService的getProduct方法实现
6、模板中做变量调用

后附源码

4、新建product2组件

 ng g component product2

5、新建anotherProduct 服务组件

 ng g service shared/anotherProduct

案例解析 | anotherProductService中的代码实现

调用ProductService中的接口,复写实现getProduct()方法来返回Product对象的值

import { Injectable } from '@angular/core';
import {Product, ProductService} from "./product.service";

@Injectable()
export class AnotherProductService implements ProductService{
  getProduct(): Product {
    return new Product(1,'sumsung s7',4899,'新最新款三星手机');
  }


  constructor() { }

}

product2组件中通过定义providers提供器的useClass属性来调用AnotherProductService对象来实现数据的加载

import { Component, OnInit } from '@angular/core';
import {Product, ProductService} from "../shared/product.service";
import {AnotherProductService} from "../shared/another-product.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() {
    /* 组件生成的生命周期函数里面 给product变量赋值 */
    this.product = this.productService.getProduct();
  }

}

提供器的作用域

1、提供器providers声明在模块中时,对所有组件可见的,所有组件都可以注入它;
2、当提供器providers声明在组件中时,只对组件及其子组件可见,其它组件不可注入它;
3、模块和组件中的提供器有相同的token时(privide属性定义名称相同),组件中的提供器会覆盖模块中的;
4、提供器优先定义在模块中。

ProductService中的类有@Injectable()装饰器代表,它可以在自身的构造函数中注入别的类

@Injectable()
export class ProductService {

  constructor() {
  }

  /*  定义getProduct方法,返回Product对象*/
  getProduct(): Product {
    return new Product(0,'iPhone7',5899,'新品上市,最新款');
  }

}

服务之间如何注入

ng g service shared/logger

???

工厂函数来提供器

...
  providers: [{
    provide:ProductService,
    useFactory:(logger:LoggerService,appConfig) => {
      if(appConfig.isDev){
        return new ProductService(logger);
      }else{
        return new AnotherProductService(logger);
      }

    },
    deps:[LoggerService,"APP_CONFIG"]
  },LoggerService,{
    provide:"APP_CONFIG",useValue:{isDev:false}
  }],
 ...

1、ProductService对象利用工厂函数来自动判断给product1和product2是注入ProductService还是AnotherProductService
2、useFactory中有两个参数,LoggerService是在ProductService中注入的,所以,做为参数的话,要增加deps属性来声明做为参数依赖,为可实现LoggerService的自动依赖注入,“判断代码可以在及自身内部实现”;
3、参数appConfig是依赖于APP_CONFIG对象,通过判断自身useValue属性对象中的isDev的值来判断product1和product2是注入ProductService还是AnotherProductService

注入器的层级关系

Angular中只有在构造函数的参数中提供依赖注入

export class Product2Component implements OnInit {


  product:Product;//需要一个变量用于模板渲染

  constructor(private productService:ProductService) { }

  ngOnInit() {
    /* 组件生成的生命周期函数里面 给product变量赋值 */
    this.product = this.productService.getProduct();
  }
}

源码:
链接: https://pan.baidu.com/s/1kVy0FJL 密码: cca7

重构auction项目,使用依赖注入

1、新建服务product

ng g service shared/product

2、模拟数组Product 和 CommentArray,提供三个方法 getProducts 查看商品列表,getProduct 通过ID查看商品详情,getCommentForProductId通过商品ID查看商品评价

...

@Injectable()
export class ProductService {

  private products: Product[] = [
    new Product(1, '商品1', 1.99, 3.5, '第一个商品', ['电子产品', '硬件产品']),
    new Product(2, '商品2', 2.99, 4, '第二个商品', ['电子产品']),
    new Product(3, '商品3', 1.89, 5, '第三个商品', ['图书']),
    new Product(4, '商品4', 1.33, 4.5, '第四个商品', ['电子产品', '硬件产品']),
    new Product(5, '商品5', 3.0, 2.5, '第五个商品', ['硬件产品']),
    new Product(6, '商品6', 4.50, 1.5, '第六个商品', ['电子产品']),
  ];

  private comments: CommentArray[] = [
    new CommentArray(1, 1, "2017-04-12 08:12:01", "李伟", 3, "东西不错"),
    new CommentArray(2, 1, "2017-04-12 23:12:11", "刘涛", 4, "质量过硬"),
    new CommentArray(3, 2, "2017-04-12 15:12:11", "宗良", 5, "上次还会买"),
    new CommentArray(4, 1, "2017-04-12 22:12:11", "汉洋", 2.5, "质量好差,很丑"),
    new CommentArray(5, 2, "2017-04-12 11:50:11", "张和", 3.3, "凑合着用吧"),
  ];

  constructor() {
  }

  /* 显示商品列表 */

  getProducts(): Product[] {
    return this.products;
  }

  /* 通过Id查看商品 */
  getProduct(id: number): Product {
    return this.products.find((product) => product.id == id);
  }

  /*  过通商品Id,获取商品的评价信息 */

  getCommentForProductId(id: number): CommentArray[] {
    return this.comments.filter((comment: CommentArray) => comment.productId == id);
  }

}

export class Product {
  constructor(public id: number,
              public title: string,
              public price: number,
              public rating: number,
              public desc: string,
              public categorys: Array<string>) {

  }
}

export class CommentArray {
  constructor(public id: number,
              public productId: number,
              public timestamp: string,
              public user: string,
              public rating: number,
              public content: string) {

  }
}

3、app.module.ts中提供器声明ProductService

 providers: [ProductService],

4、product组件中,constructor构造函数中注入ProductService,在ngOnInit调用getProducts方法。

...
export class ProductComponent implements OnInit {

  private imgUrl = 'http://placehold.it/320x150';
  private products:Product[];

  constructor(private productService:ProductService ) { }

  ngOnInit() {
    this.products = this.productService.getProducts();
  }
}

5、ProductDetail组件中,constructor中注入ActivatedRoute和ProductService,在ngOnInit中调用getProduct()和getCommentForProductId()方法。

...
export class ProductDetailComponent implements OnInit {

  product:Product; //定义了一个Product类型的本地属性product(单个商品)

  comments:CommentArray[];

  constructor(private routeInfo:ActivatedRoute,
              private productService:ProductService
) { }

  ngOnInit() {
    let productId:number = this.routeInfo.snapshot.params['productId'];
    this.product = this.productService.getProduct(productId);
    this.comments = this.productService.getCommentForProductId(productId);
  }

}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,424评论 25 707
  • 模板表达式“{{}}”不能引用任何全局命名空间中的成员(如:window、document等等)的原因: 我想原因...
    科研者阅读 947评论 2 4
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,594评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,567评论 18 399
  • 一、什么是依赖注入 控制反转(IoC) 控制反转的概念最早在2004年由Martin Fowler提出,是针对面向...
    Keriy阅读 3,169评论 0 8