typescript 将服务注入组件

aiqt4smr  于 2023-04-07  发布在  TypeScript
关注(0)|答案(3)|浏览(114)

仅供参考:使用angular2(2.0.0-alpha.45)和TypeScript(1.6.2)
尝试创建一个简单的服务以注入到组件中。
我得到的错误:
无法解析{ComponentName}(?)的所有参数。请确保它们都具有有效的类型或注解。
Bootstrap :

bootstrap(App, [ROUTER_PROVIDERS, HTTP_PROVIDERS]);

服务(my-service.ts):

import {Injectable} from 'angular2/angular2';
@Injectable()
export class MyService {
  public doSomething() {}
}

消耗组件:

import {Component} from 'angular2/angular2';
import {MyService} from './my-service';
export class ListManager{
  constructor(private myService: MyService){
    console.log('myService', myService);
  }
}

我试过的东西

  • 在服务中:
  • 使用@Injectable标记/取消标记服务
  • 在bootstrapping中:
  • MyService添加/删除到提供程序的引导列表中
  • 组件内
  • 将服务指定为提供者@Component({providers: [MyService]})
  • 将服务指定为绑定@Component({bindings: [MyService]})
ryoqjall

ryoqjall1#

我想你会做:

constructor(private myService: MyService){
    console.log('myService', myService);
}

您还必须在@Component定义中将服务指定为提供者

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

sg3maiej2#

尝试在你的组件中这样做:

import {Component} from 'angular2/angular2';
import {Inject} from 'angular2/core';
import {MyService} from './my-service';

export class ListManager{
  private listService: ListService;

  constructor(@Inject(ListService) listService: ListService){
      console.log('listService', listService);
  }
}

(Pay注意构造函数中的新导入和@Inject
让我知道它是否对你有效。一个plunker也将有助于隔离问题。

kse8i1jr

kse8i1jr3#

**inject()**是一个可以在运行时动态获取依赖或服务的函数。它允许您在方法或属性装饰器中注入服务或依赖,或者在构造函数之外需要访问服务或依赖的任何地方。

先决条件:Angular 〉=14

import { Component, inject } from '@angular/core';
import { MyService } from './my.service';

@Component({
  selector: 'di-component',
  template: '<h1>{{ data}}</h1>'
})
export class DIComponent implements OnInit {
  data: string;

  constructor() {}

  ngOnInit(): void {
    const runtimeService = inject(MyService);
    this.data = myService.getServiceMethod();
  }
}

相关问题