【问题标题】:Angular practice - using scope inheritance vs injectionAngular 实践 - 使用范围继承与注入
【发布时间】:2014-05-14 15:43:19
【问题描述】:

我在一次会议上提出了一个问题,希望获得一些专家意见。 假设我有一个“userService”,我的应用程序中的许多控制器都需要它。 (实际上是大多数)。

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

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

对我来说,这种观点似乎是错误的,并且忽略了 Angular 的要点以及它如何使用原型继承以及作用域的力量。这实际上不会在内存中创建引用同一事物的不必要实例吗?你为什么要这样做?

我很想听听对此的一些经验意见。 谢谢!

【问题讨论】:

    标签: javascript angularjs inheritance


    【解决方案1】:

    内存中的引用很便宜。不要担心那些。更重要的是,当您将某些内容放在孩子需要完成其工作的范围内时,您正在隐式创建一个导致不可重用组件的依赖项。相反,您应该通过参数列表预先声明您的依赖项。稍后当您进行测试时,您会感谢自己。范围继承适用于模板,而不是控制器。

    【讨论】:

    • 所有优秀的 cmets 伙计们,谢谢!你让我变得更聪明了:)
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2018-08-30
        • 2016-03-29
        • 2013-01-23
        • 2019-02-10
        • 2013-02-13
        • 1970-01-01
        • 2015-07-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多