在angularjs中访问服务或工厂内部的范围是否正确

时间:2018-11-23 13:32:28

标签: angularjs

免责声明:我知道有一些问题建议不要访问服务或工厂内部的范围,但在这里我希望对编码准则产生影响,如果不是,那么我是否需要适当的理由。

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

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

我觉得这不是编写服务/工厂的正确方法。我觉得我们正在使事情变得复杂,因此建议删除上面的代码部分。 为了证明这一点,我告诉过: 1.这将使单元可测试性变得复杂,现在我们正在尝试使用以前测试指令的方式来测试服务。 2.并且我们正在将该服务与指令紧密结合在一起。 3.服务无意访问范围。

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

1 个答案:

答案 0 :(得分:0)

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

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

除了在关系方面令人困惑之外,诸如此类的事情最终还阻碍了垃圾收集器的运行。

  

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

服务类应在控制器提供的数据上工作,并在需要时可在其他任何地方重用。 还要远离示波器,保持代码精简和干净,从而具有更好的可维护性。

我更喜欢将域对象放入控制器范围并将其传递给服务。这样,无论在控制器内部还是将来在其他服务中使用该服务,该服务都能正常工作。