如何动态更改角度服务实现?

2023-11-23

我是 Angular2 的新手,并且我有两项服务DefaultService And SpecialService应根据组件状态交替使用 我不知道是否可以将单例注入到我的组件中GeneralService以某种方式表现得像DefaultService or SpecialService通过改变其实现。

我有另一个想法将这两种服务注入generalService并将他们的方法委托给适当的服务。

感谢告诉我如何实现第一个想法(如果可行),或者建议我另一个想法。

@Component({
  selector: 'my-app',
   templateUrl : './content.component.html'
})
export class AppComponent  { 
constructor(generalService : GenralService,injector : Injectot){}
@ViewChild(MySon)
    private mySon : MySon;
    state : State;

    onChangeState(newState : State):void{
        if(state = special)
        //this.generalService = this.injector.get('SpecialService');
        myson.updateplease();
    }
}

Assume SpecialService and DefaultService延伸GeneralService


更干净的方法是使用interface,这样你就会得到智能感知! :)

export interface IYourService {
  func1: (source: string, subString: string) => boolean;
  func2: () => void;
  func3: () => string;
}

@Injectable()
export class SuperService implements IYourService {
  public func1(source: string, subString: string): boolean {
    return true;
  }

  public func2(): void {
    console.log('SuperService: func2();');
  }

  public func3(): string {
    return "SuperService";
  }
}

@Injectable()
export class SpecialService implements IYourService {
  public func1(source: string, subString: string): boolean {
    return false;
  }

  public func2(): void {
    console.log('SpecialService: func2();');
  }

  public func3(): string {
    return "SpecialService";
  }
}

@Injectable()
export class GeneralService {

  public state = 'SuperService';

  constructor (
    private _superService: SuperService,
    private _specialService: SpecialService
  ) {}

  public get instance(): IYourService {
    if (this.state == 'SuperService') return this._superService;
    else return this._specialService;
  }
}

@Component({
  selector: 'my-app',
  template: `
    <div>
      <h2 (click)="switchService()">Hello {{name}} - active service: {{ this._generalService.state }} - click me to switch it!</h2>
      <button (click)="labelFunc1.innerHTML = _generalService.instance.func1()">func1</button>
      <label #labelFunc1></label>
      <br />
      <button (click)="_generalService.instance.func2()">func1</button>
      <br />
      <button (click)="labelFunc3.innerHTML = _generalService.instance.func3()">func1</button>
      <label #labelFunc3></label>
    </div>
  `,
})
export class App {
  name:string;
  constructor(private _generalService: GeneralService) {
    this.name = 'Angular2'
  }

  private switchService() {
    if (this._generalService.state == 'SuperService') {
      this._generalService.state = 'SpecialService';
    }
    else this._generalService.state = 'SuperService';
  }
}

现场演示:https://plnkr.co/edit/OM5nnAR0kzSeV24vKqL5?p=preview

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何动态更改角度服务实现? 的相关文章

随机推荐

  • 为什么这里不需要显式强制转换?

    class MyClass void myMethod byte b System out print myMethod1 public static void main String args MyClass me new MyClass
  • nodejs require - 模块名称区分大小写问题

    最近我发现了一个关于node js require机制的奇怪问题 您可能会认为 由于 Windows 文件系统 所需模块是否区分大小写并不重要 所以 模块A require fancyModule 模块B require fancymodu
  • 如何抑制詹金斯管道控制台输出中的源脚本行回显?

    我正在 Jenkins 中编写一个管道作业 它在管道控制台输出中显示下游作业的输出控制台 到目前为止 该作业正在运行 但由于管道作业本身将所有回显线添加到输出中 因此输出确实很难读取 Started by user email protec
  • Codeigniter - 未指定输入文件

    我是 Codeigniter 的初学者 我看到了 CI 教程 只是想做一件简单的事情 我下载了 CI 并将此文件添加到控制器目录中 但它不起作用 当我尝试使用它访问它时http index php site我得到输出 未指定输入文件 顺便说
  • 谷歌翻译顶栏隐藏

    我在我的网站上使用谷歌翻译 我想隐藏谷歌翻译的顶部栏 请告诉我如何隐藏该栏 请在此处检查我的网站链接http www rewords com让我知道我要隐藏那个栏吗 Thanks 通过 CSS 完成 goog te banner frame
  • :root 变量在 :before 元素上不可用

    我将很多 css 变量分配给 root 但这些变量在我的 before 元素中无法访问 我在网上找不到任何关于此的信息 当检查 before 元素的父元素时 我在谷歌开发工具的样式面板底部看到所有 root 变量 请参阅下面的屏幕截图 my
  • 如何在 Python 中对函数进行深度复制?

    我想在 Python 中制作一个函数的深度复制 这copy根据该模块没有帮助文档 其中说 该模块不复制模块 方法 堆栈跟踪 堆栈帧 文件等类型 套接字 窗口 数组或任何类似的类型 它确实 复制 函数和类 浅层 并深入 通过不变地返回原始对象
  • 如何检测 makefile `--silent/--quiet` 命令行选项是否已设置?

    如何检测makefile是否存在 silent quiet命令行选项已设置 相关问题 如何检测是否使用 rake 指定了 quiet 选项 我认为你需要 findstring s word 1 MAKEFLAGS 因为 MAKEFLAGS
  • calendar.getDisplayName 返回错误的日期

    下面是我的程序 当我输入相关的月份 日期和年份时 它返回错误的日期名称 我在这里缺少什么 我的计划 import java util Calendar import java util Locale import java util Sca
  • 理解git:将分支连接到远程存储库

    我在 github 上有一个存储库 比如 testrepo 现在我想设置一个本地存储库repo有一个分支origin master我希望能够从存储库中编辑内容 repo origin master lt gt origin master 克
  • 有什么方法可以从 Linux 用户空间向 SD 卡发送命令吗?

    我有一个 Debian 7 0 Linux 3 2 嵌入式 ARM TI AM335x 系统 这是我们开发的定制板 但是SD卡部分至少和开发板是一样的 我想向卡发出一些特定于供应商的 SD 卡命令 即使用 CMD56 读取一些 SMART
  • 替代 PHP exec() 函数

    目前我正在使用 exec zcat filename output 解压缩一个 Z输入文件 但不幸的是我的托管公司现在已禁用此功能 有解决方法吗 pathtofile filename lis Z exec zcat pathtofile
  • 可串行化事务死锁

    文件说 serializable交易一笔接一笔地执行 但实际上这似乎并非事实 这是两笔几乎相等的交易 区别只是延迟了 15 秒 1 set transaction isolation level serializable go begin
  • Int 数组的数组。仅按顺序存储重复项

    我需要存储一个 Int 数组的数组来存储有序重复项 位于数组中 Example 给定数组 mainArray 7 7 3 2 2 2 1 7 5 5 现在我需要创建一个 int 数组的二维数组 例子 Array 7 7 3 2 2 2 1
  • R:从数值变量和自定义/开放式/单值区间创建分类变量

    我经常发现自己尝试从数值变量 用户提供的一组范围创建分类变量 例如 假设我有一个带有数字变量的 data framedf V并想创建一个新变量df VCAT这样 df VCAT 0 if df V等于 0 df VCAT 1 if df V
  • 通过补丁或合并提案在启动板上提交错误修复?

    我是新来的发射台 and Bazaar 我正在尝试找出提交错误修复的最佳方法 我正在使用一些托管在 Launchpad 上的相当流行的开源软件 但它不是很稳定 我创建了自己的项目分支来稳定它 并仅应用我们需要的错误修复 而无需添加正在进行的
  • 如何使用API​​网关调用AWS步骤函数?

    根据Amazon的文档 可以使用HTTP API调用step函数 Step Functions 可以通过 Step Functions 访问和使用 控制台 AWS 开发工具包或 HTTP API 我试图搜索详细信息 但似乎找不到任何好的信息
  • 按父 ID 的顺序选择记录

    简单的问题 只是无法按照我需要的顺序获得结果集 p 我有一个表 类别 id name parent 1 apple 0 2 macintosh 1 3 atari 0 4 st 3 5 lisa 1 我试图选择获取以下结果集 1 apple
  • Azure Web 应用程序的数据库连接速度慢

    我开发了一个 Web 应用程序 一个标准的 Web 应用程序 允许用户显示和更新 SQL 数据库中的一组数据 Web 应用程序使用 AngularJS 客户端 该客户端通过 MVC Web API 调用与 Web 服务器交互 以检索和更新数
  • 如何动态更改角度服务实现?

    我是 Angular2 的新手 并且我有两项服务DefaultService And SpecialService应根据组件状态交替使用 我不知道是否可以将单例注入到我的组件中GeneralService以某种方式表现得像DefaultSe