2014-05-14 30 views
0

我有一个问题出现在我想获得一些专家意见的会议上。 可以说我有一个'userService',在我的应用程序中需要许多控制器。 (实际上大多数)。角度练习 - 使用范围继承vs注入

我相信任何父控制器都会注入此userService并将该服务的属性公开给子控制器。由于任何“子”控制器都可以访问父范围,因此不需要将“userService”注入到每个控制器中。

另一个人的观点是将'userService'注入到需要它的每个控制器中,而不管该服务是否已从其父项继承,基本上是因为它使代码更易于阅读并且易于找到变量来自哪里从。

对我来说,这个观点看起来是错误的,错过了Angular的观点,以及它如何使用原型继承和范围的力量。这难道不会在内存中创建引用相同内容的不必要实例吗?你为什么想这么做 ?

我很想听听这方面的一些经验意见。 谢谢!

回答

2

内存中的引用很便宜。不要担心这些。更重要的是,当你将一些东西放在一个孩子需要做的工作的范围上时,你隐式地创建了一个依赖,导致一个不可重用的组件。你应该首先声明你的依赖关系 - 通过参数列表。稍后当你来测试时你会感谢你。范围继承适用于模板 - 不是控制器。

+0

所有好评家伙,谢谢!你让我变得更聪明:) – 29er

1

这两种方式都有一些参数,但是我尽可能避免范围继承。我甚至在我的大部分指令中都隔离了范围。原因是你可以更自然地解耦和封装你的代码。一般来说,封装在控制器上不是什么问题,但很高兴知道无论您处于范围层次结构中的哪个位置,都可以随时访问您的服务。

0

有人可以纠正我,如果我错了,但我认为它的工作原理是这样的。

Controller A注入服务A.它可以通过A.method Controller B继承访问它从控制器A,但无法访问服务,因为它不知道它是什么。

当您将该服务分配给作用域变量时,作用域继承将发挥作用。如果我们现在更改它以便Controller A设置$scope.A = A那么Controller B将能够通过$scope.A.method访问该服务,因为它已继承此设置。

我不认为注入的服务本身是继承的。

就记忆而言,我不会太担心。 Angular不会创建一个新实例,只是对它的引用。服务是单身人士,不会被重新创建,除非被破坏。如果你使用工厂,那么你可能会得到新的对象,但这是不同的。