2017-07-29 56 views
0

我是新来的打字稿,角度2和一个问题,我无法让我的思想围绕是。我认为服务是一个文件或文件,这些文件或文件具有对许多组件都有用和常用的功能。所以最终使这些功能成为中心,并因此在所有这些组件中使用。角度服务注入和导入对象之间的差异

所以我的问题是什么是这些服务,他们必须注入时,我可以创建一个功能的对象文字,只是在组件中导入它们。我仍然可以使用我导入的对象调用这些功能。

+2

服务是单身,对象不是。如果某个组件更改了某个服务的某个属性的值,则其他组件可以看到该值发生了更改,而如果某个组件更改了该对象的某个属性的值,则只能看到该更改。 – Claies

+1

注入器允许重新实例化,替换或修改服务实例,而不更改定义或使用它们的文件,包括测试。这是不可能的进口,至少没有黑客。这是任何DI容器的特点,并不是Angular特有的。 – estus

+0

谢谢你们,我想所有的答案都让事情更加清晰:) – Jdsans

回答

1

放弃一个类的类型,只是使用它是完全有效的。然而,在角依赖注入机制,让你实现同样的事情,但也有一些额外的好处:

  • 实例可以是可以不同的地方 在声明的作用域单身(应用程序,模块,组件)
  • 您可以在@Inject构造函数参数中声明一个基类或接口(通过注入令牌),然后配置将在您的模块配置中注入哪个类
  • 角注入器具有很多灵活性,实例由注入器构建并交付
  • You c为测试注入不同的类比运行时,这使得嘲笑测试服务非常容易
-1

要重申评论所说的话,服务的单个实例旨在跨多个组件/类使用。这是依赖注入完成的。例如,如果在多个组件使用的服务中有待完成的项目数组,则此列表在所有组件中都是相同的,因此如果一个组件添加到列表中,则所有其他组件都会看到此更改反映出来。

另一方面,导入对象文本会为每个组件使用不同的实例。因此,在同一示例中,如果服务对象包含待办事项项目的数组,则每个导入此对象的组件都将具有单独的待办事项列表,这些项目之间不会有任何关联。

希望能够澄清问题。

+1

我不同意你在第一段中的陈述。这取决于你如何注入服务。你描述了共享服务的情况,这是同一个实例。但是你可以在许多情况下注入数组,以便共享数组 – Vega

+0

它与应用程序组合有关,使用模块vs使用类+ DI令牌,但都提供了平分共享状态的能力。 –