Browse Source

使用相同token,指定多種provider

master
HarveyMac 2 years ago
parent
commit
5d8ca49605
  1. 11
      src/app/a/a.module.ts
  2. 16
      src/app/app.component.html
  3. 22
      src/app/app.component.ts
  4. 13
      src/app/app.module.ts
  5. 11
      src/app/b/b.module.ts
  6. 12
      src/app/i18n.service.ts
  7. 9
      src/app/order-detail.ts
  8. 8
      src/app/order.interface.ts
  9. 19
      src/app/order.service.ts

11
src/app/a/a.module.ts

@ -0,0 +1,11 @@
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
@NgModule({
imports: [
CommonModule
],
declarations: [],
providers: [{ provide: 'i18nFolder', useValue: 'a-module', multi: true }]
})
export class AModule { }

16
src/app/app.component.html

@ -1,14 +1,2 @@
<table border="1">
<tr>
<th>單價</th>
<th>數量</th>
</tr>
<tr *ngFor="let item of orderService.details">
<td>{{ item.UnitPrice }}</td>
<td>{{ item.PurchaseCount }}</td>
</tr>
<tr>
<td>總金額</td>
<td>{{ total }}</td>
</tr>
</table>
<h3>多個 i18n 資料夾設定</h3>
<pre>{{ i18nService.i18nFolder | json }}</pre>

22
src/app/app.component.ts

@ -1,24 +1,12 @@
import { Component, Inject, OnInit } from '@angular/core';
import { Component, VERSION } from '@angular/core';
import { OrderDetail } from './order-detail';
import { IOrderService, ORDER_SERVICE } from './order.interface';
import { I18nService } from './i18n.service';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
styleUrls: [ './app.component.css' ]
})
export class AppComponent implements OnInit {
total = 0;
//@Inject 注入Service(ORDER_SERVICE) Token
constructor(@Inject(ORDER_SERVICE) public orderService: IOrderService) {}
ngOnInit(): void {
this.orderService.details = [
new OrderDetail({ PurchaseCount: 2, UnitPrice: 200 }),
new OrderDetail({ PurchaseCount: 4, UnitPrice: 50 }),
];
this.total = this.orderService.computeTotal();
}
export class AppComponent {
constructor(public i18nService: I18nService) {}
}

13
src/app/app.module.ts

@ -3,13 +3,12 @@ import { BrowserModule } from '@angular/platform-browser';
import { FormsModule } from '@angular/forms';
import { AppComponent } from './app.component';
import { ORDER_SERVICE } from './order.interface';
import { OrderService } from './order.service';
import { AModule } from './a/a.module';
import { BModule } from './b/b.module';
@NgModule({
imports: [BrowserModule, FormsModule],
declarations: [AppComponent],
providers: [{ provide: ORDER_SERVICE, useClass: OrderService }],
bootstrap: [AppComponent],
imports: [ BrowserModule, FormsModule, AModule, BModule ],
declarations: [ AppComponent ],
bootstrap: [ AppComponent ]
})
export class AppModule {}
export class AppModule { }

11
src/app/b/b.module.ts

@ -0,0 +1,11 @@
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
@NgModule({
imports: [
CommonModule
],
declarations: [],
providers: [{ provide: 'i18nFolder', useValue: 'b-module', multi: true }]
})
export class BModule { }

12
src/app/i18n.service.ts

@ -0,0 +1,12 @@
import { Inject, Injectable } from '@angular/core';
@Injectable({
providedIn: 'root',
})
export class I18nService {
i18nFolder: string[];
constructor(@Inject('i18nFolder') folders: string[]) {
this.i18nFolder = folders.map((folder) => `assets/${folder}`);
}
}

9
src/app/order-detail.ts

@ -1,9 +0,0 @@
export class OrderDetail {
constructor(initData?: Partial<OrderDetail>) {
Object.assign(this, initData);
}
PurchaseCount!: number;
UnitPrice!: number;
}

8
src/app/order.interface.ts

@ -1,8 +0,0 @@
import { InjectionToken } from "@angular/core";
import { OrderDetail } from "./order-detail";
export const ORDER_SERVICE = new InjectionToken<IOrderService>('Order Service');
export interface IOrderService {
details: OrderDetail[];
computeTotal():number;
}

19
src/app/order.service.ts

@ -1,19 +0,0 @@
import { Injectable } from '@angular/core';
import { OrderDetail } from './order-detail';
import { IOrderService } from './order.interface';
@Injectable({
providedIn: 'root',
})
export class OrderService implements IOrderService {
details: OrderDetail[] = [];
constructor() {}
computeTotal(): number {
return this.details
.map((d) => d.PurchaseCount * d.UnitPrice)
.reduce((act, curr) => act + curr, 0);
}
}
Loading…
Cancel
Save