在非Angular类中获取注入的依赖项

时间:2018-11-05 13:34:38

标签: angular typescript dependency-injection

我有当前(和简化的)课程:

export class NavigationItem {
  constructor(
    private router: Router
  ) {}

  navigateTo() { this.router.navigate([this.id]); }
}

我不想在每次声明此类的新实例时都将自己插入路由器。

有办法吗?我想到了

export class NavigationItem {

  @Inject(forwardRef(() => Router))
  private _router: Router;

  constructor() {}

  navigateTo() { this.router.navigate([this.id]); }
}

但是它似乎不起作用。任何想法 ?

1 个答案:

答案 0 :(得分:3)

您可以创建一个工厂服务来处理NavigationItem的创建并将它们与Router连接起来。这是一个NavigationItemFactory类的示例:

// imports

@Injectable({ providedIn: 'root' })
export class NavigationItemFactory {
    constructor(private router: Router) { }

    createItem(): NavigationItem {
        return new NavigationItem(this.router);
    }
}

因为它使用了Angular 6+的providedIn功能,所以您不需要在模块中声明此工厂类,这使得它可以在项目之间轻松移动。

要在项目中创建这些项目的任何地方,只需依赖NavigationItemFactory并相应地使用其createItem函数即可。当然,这仍然是您在项目中需要的依赖项,但至少现在它是对您自己的类型的依赖,而不是Router本身。