【Angular专题】——(2)【译】Angular中的ForwardRef (2)

答案是我们可以使用另一种解决方案。我们使用@Inject注解和forwardRef函数来替代之前方式,也就是声明一个NameService类型的参数nameService,如下所示:

import { Component, Inject, forwardRef } from '@angular/core'; @Component({ selector:'my-app', template:'<h1>Favourite framework:{{ name }}</h1>' }) class AppComponent{ name: string; constructor(@Inject(forwardRef(()=> NameService)) nameService){ this.name = nameService.getName(); } } class NameService{ getName(){ return "Angular" } }

forwardRef所做的工作,就是接收一个函数作为参数,然后返回一个class,因为这个函数并不是立即被调用的,而是在NameService声明之后才会安全地返回NameService,也就是说当()=>NameService执行的时候,NameService的值已经不是undefined了。

四. 小结

这个场景并不会经常出现,一般它只在当我们想要注入在同一个文件中声明的类时才会发生,大多数情况下我们在一个文件中只会声明一个类,并且会在文件的头部引入其他依赖的类,以此来保证不会被class不进行变量提升的特性造成困扰。

五.补充

以下内容摘录自Angular中文网:

在Typescript里面,类声明的顺序很重要,如果一个类尚未定义,就不能引用它。

这通常都没有问题的,特别是遵循一个文件一个类规则的时候。但有时候循环引用可能无法避免,当类A引用类B,同时B又引用A时,就会陷入困境:它们中的某一个必须先定义。

forwardRef( )建立一个间接引用,供Angular随后解析。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwzffg.html