共计 803 个字符,预计需要花费 3 分钟才能阅读完成。
inject 函数只能用于结构器阶段,这意味着其只能在结构器函数作用域(constructor function scope)和字段初始化器(field initializers)中应用。
下列代码会遇到运行时谬误 (runtime error):
因为应用到了 inject
函数的 fetchEntity 办法,在构造函数作用域之外的上下文里被调用,不合乎 inject 函数的应用前提。
当在构造函数阶段之外调用 refreshEntity 办法时,下面的代码将引发运行时谬误,例如在单击按钮时,因为 fetchEntity 应用了 inject()。当用于初始化 entity$ 属性时,它不会抛出此谬误,因为它处于构造函数阶段。
解决方案也不难,应用 JavaScript 的 closure 闭包概念:
在下面的例子中,因为咱们应用了一个闭包,所以咱们可能将注入的 HttpClient 和 ActivatedRoute 存储在闭包范畴内,并且依然应用返回函数中的值。因而,咱们能够在构造函数阶段之外利用 inject() 函数。
正如咱们在下面的示例中曾经看到的那样,应用 inject 函数可能放弃组件合乎繁多职责的设计准则(single responsibility)和无依赖注入。
依赖注入或 DI 是 Angular 中的基本概念之一。DI 被连贯到 Angular 框架中,并容许具备 Angular 装璜器的类(例如组件、指令、管道和可注入)配置它们须要的依赖项。
DI 零碎中存在两个次要角色:依赖消费者和依赖提供者。
咱们不再间接在组件构造函数中依赖 HttpClient 或 ActivatedRoute。相同,咱们创立了一个可注入的函数来解决业务逻辑,这种思路相似于咱们如何将逻辑提取到一个 Facade 服务中。并且 Angular 的最佳事件认为,Component 须要实现的业务逻辑最好都封装到一个专门的 Facade 服务中。
应用 inject() 函数,咱们不再须要组件中的任何依赖项。