首页 > 解决方案 > 在angularjs中访问服务或工厂内的范围是否正确

问题描述

免责声明:我知道有某些问题建议不要访问服务或工厂内部的范围,但在这里我期待编码指南方面的影响/如果不建议这样做是否可取,那么我需要适当的理由。

我们有 angular js 项目,这个项目很旧。现在,在重构之后,我的一位同事将通用实现从指令转移到了服务。在这样做的同时,要访问指令的范围,他手动开始执行如下操作:

    angular.element('<test-dir></test-dir>').scope();

我觉得这不是编写服务/工厂的正确方法。我觉得我们让事情变得复杂,并建议删除上面的代码部分。为了证明同样的道理,我告诉过: 1. 这将使单元可测试性变得复杂,现在我们正尝试以我们过去测试指令的方式测试服务。2. 我们正在使这项服务与指令紧密耦合。3.服务不意味着访问范围。

但我认为我无法说服他,因为我没有太多理由来证明这一点。有人可以建议我的理解是否正确并给出适当的理由来说服他。谢谢!

标签: angularjs

解决方案


不,服务/工厂应该处理数据,并且应该具有处理提供给它们的数据的逻辑。最好不要引用 DOM 对象或范围变量。

我个人认为将 $scope 传递给服务是一个坏主意,因为它创建了一种循环引用:控制器依赖于服务,而服务依赖于控制器的范围。

除了在关系方面令人困惑之外,像这样的事情最终会妨碍垃圾收集器。

服务只是应用程序业务层的一个功能。它充当构造函数,并在运行时使用 new 调用一次,就像使用普通 JavaScript 一样(Angular 只是为我们调用一个新实例)。service当您只想创建充当公共的东西时使用蜜蜂。

服务类应该处理控制器提供的数据,如果需要,可以在任何其他地方重用它。同时保持范围远离它,保持代码精简和干净,从而更好的可维护性。

我更喜欢将域对象放在控制器范围内并将其传递给服务。这样,无论它在控制器内部使用,还是将来在另一个服务内部使用,服务都可以正常工作。


推荐阅读