角度练习 - 使用范围继承与注入

时间:2014-05-14 15:43:19

标签: javascript angularjs inheritance

我在会议中提出了一个问题,我希望得到一些专家意见。 假设我有一个' userService'我的应用程序中的许多控制器需要。 (事实上​​大部分都是这样)。

我相信任何父控制器都会注入此userService并将该服务的属性公开给子控制器。因为任何一个孩子都可以控制器可以访问父作用域,不需要注入“用户服务”。进入每个控制器。

另一个人的意见是注入' userService'进入每个需要它的控制器,无论服务是否已经从它的父级继承,主要是因为它使代码更易于阅读并且易于找到变量的来源。

对我而言,这种观点似乎是错误的,并且忽略了Angular的观点以及它如何使用原型继承以及范围的力量。这实际上是不是在内存中创建了引用相同内容的不必要实例?你为什么要那样做?

我很想听到一些关于此的经验意见。 谢谢!

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

两种方式都有一些参数,但我尽可能避免范围继承。我甚至在大多数指令中都使用了范围。原因是您可以更自然地解耦并封装您的代码。封装在一般情况下对控制器来说不是一个问题,但很高兴知道无论你在范围层次结构中的什么位置,你总能得到你的服务。

答案 2 :(得分:0)

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

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

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

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

在记忆方面,我不会太担心。 Angular不会创建新实例,只是对它的引用。服务是单身人士,除非他们被摧毁,否则不会重建。如果你正在使用工厂,那么你可能会得到新的对象,但那是不同的。