为子组件使用服务,而不必将其注入构造函数

时间:2017-11-15 10:27:18

标签: angular

我想使用服务获取有关应用支持的当前硬币的信息。

因此我创建了Service:CoinsService

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

const coins = {
  "btc":"bitcoin",
  "ltc":"litecoin"
};

@Injectable()
export class CoinsService {

  getCoins(){
    return coins;
  }

  getSpecificCoin(coinShortcut: string) {
    return coins[coinShortcut];
  }
}

我的用户类如下所示:

import { CoinsService } from './coins.service';

export class User {
  constructor(public id: number, public balance: number, public coinsService: CoinsService) {
    console.log(coinsService.getCoins());
  }
}

在服务之前,如果我想创建一个用户,我就是这样做的: 让userA =新用户('1','200');

现在有了服务,我需要在创建对象时传入coinService: 让userA =新用户('1','200',coinService)

为了完整性,我还发布了app.component.ts:

import { Component } from '@angular/core';
import { User } from './user';
import { CoinsService } from './coins.service';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css'],
  providers: [CoinsService]
})
export class AppComponent {
  title = 'app';

  constructor(private coinsService: CoinsService){
      let userA = new User(1, 200, coinsService);
  }
}

是否有其他选项可以在没有用户类的情况下使用该服务 “将它传递给”实际需要它的组件?

我想创建用户,而不是每次为每个用户明确告诉它需要CoinsService。

创建的每个用户都可以访问它,这应该是标准。

此外,该服务应该能够在App.Component下面的每个组件中使用。 这就是我在提供者数组中输入CoinssService的原因。

感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

您可以制作方法static并从任何地方调用

@Injectable()
export class CoinsService {

  static getCoins(){
    return coins;
  }

  getSpecificCoin(coinShortcut: string) {
    return coins[coinShortcut];
  }
}
import { CoinsService } from './coins.service';

export class User {
  constructor(public id: number, public balance: number) {
    console.log(CoinsService.getCoins());
  }
}

使用静态属性时要小心,它们就像一个全局/共享属性。如果更改静态属性,它将在该类的所有实例中更改。

更多信息:What does the 'static' keyword do in a class?

答案 1 :(得分:0)

不要传递服务本身,传递url或方法来调用coinService,例如“dollarUrl”“euroUrl”,它可以在你的URL或函数调用中使用。 'this.coinService。' + coinMethod +'(params)......

如果你需要为每个用户使用coinService,那么在你的userService构造函数中使用coinService并从这里调用它。