【问题标题】:Angular: Pass service as an argumentAngular:将服务作为参数传递
【发布时间】:2021-08-09 13:22:46
【问题描述】:

我想把一些函数放在一个外部文件中,从不同的组件调用它们,让代码更干净。

问题是,这些函数使用一个服务:

MyFunctions 类

import { Service1 } from "../_services";
export class MyFunctions {
  constructor(private service: Service1) {}
  bookingFunctions = {
    confirm: (id: any) => {
      this.service.confirmTrip(id);
    }
  };
}

我的组件

import MyFunctions from "../../../functions";
...
export class AppComponent {
  constructor(
    private service: Service1
    ) {}
...
    myFunctions = new MyFunctions(this.service);
... 
    confirmBooking(id: number){
      this.myFunctions.bookingFunctions.confirmBooking(id);
    }
... 
}

我的问题:这工作正常,但我在搜索过程中从未见过这样的解决方案。这个解决方案可能有什么问题?

我可以将服务实例Service1 传递给MyFunctions 类的构造函数吗?

我喜欢 它有效!为什么?!

【问题讨论】:

标签: angular typescript service


【解决方案1】:

很可能,您的“Service1”类型的服务里面有这个:

@Injectable({ providedIn: 'root' })

所以,整个应用程序的服务实例是相同的: 该服务就像一个singleton(就像一个为所有应用程序全局实例化的类)。

如果您不输入providedIn: 'root',并将服务注入模块的PROVIDERS:[] 部分,则该服务将仅在该模块中工作。

另一方面,如果你在组件内部指定服务,像这样:

// Component A

@Component({
/* . . . */
  providers: [MyService]
})

该服务只能访问该组件及其后代,而不能访问其他组件。 并且,如果另一个组件以相同的方式获取相同的服务:

// Component B

@Component({
/* . . . */
  providers: [MyService]
})

两个组件不会共享相同的服务,服务实例会不同。

【讨论】:

  • 谢谢,确实,这就是我所做的。我真正想知道的是如何将服务的实例(this.service)传递给另一个类的构造函数,使服务在那里工作。所以,是因为 DI,对吧?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-22
  • 2014-03-10
  • 1970-01-01
  • 2020-08-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多