将$ scope传递给angularJs服务/工厂是一个坏主意吗?

时间:2016-08-13 21:34:09

标签: javascript angularjs scope

我正在开展一个项目,其中有近90个模块。 所有模块都有一组输入字段,提交后数据应保存在服务器上。 在任何给定的时间点,只有一个模块处于活动状态。但是后台可以有开放的模块。

“提交”按钮对所有模块都是通用的,这意味着整个应用程序中只有一个“提交”按钮。

下图解释了更多。 sample structure of the page

主要的座右铭是将单个模块的更改保持在最低限度,并从中央位置处理模块中的某些事物(验证,重新加载等)。

我计划的当前方法是,

  • 使用' moduleInit'所有模块都应包含在其中的指令 部分。
  • 该指令获取模块的$ scope并将其传递给a 公共服务/工厂(pushConfigService)
  • pushConfigService只要存储并保留此范围 模块是开放的。一旦范围被破坏就引用了 相同的内容将从pushConfigService中删除。

  • 页脚面板是另一个带有“提交”按钮的指令 在pushConfigService中调用save函数,而pushConfigService又调用 模块中的$ scope函数用于获取表单数据。

  • pushConfigService与一系列其他服务进行对话 dirtyChecker,apiGenerator,最后将数据发布到服务器。

每个模块都有一组用一些标准名称定义的范围方法。例如:_submit,_onSubmit,_cancel,_reload等。

处理此问题的另一种方法是,广播提交事件,每个模块都会监听相同的事件。页脚面板可能会添加更多操作。 所以我对使用广播方法有点犹豫。

我的问题,将控制器范围传递给服务是一个好主意吗?还有其他建议吗?

提前致谢。

1 个答案:

答案 0 :(得分:1)

我相信您的核心概念是处理此设置的好方法。但我建议将业务逻辑从UI中分离出来。我没有您的代码示例,因此构建一个确切的示例有点困难。但是,由于您使用的是$scope变量,我将假设您没有使用与John Papa's类似或类似的样式指南。他的方式鼓励你不要使用$scope并接近实际的JavaScript"类"。

这有什么不同?
您无需传递整个范围,只需传递特定模块的实例即可。对于一个人来说,让你和同事有一个具体的界面来操作而不必弄清楚给定范围的组成,这不会让你感到困惑。此外,它还可以防止服务改变$scope

后者可被视为一种良好做法。只需控制器改变范围,就可以轻松找到改变和管理UI的代码。从那里,控制器可以访问服务来做实际的逻辑。

更进一步
因此,传递类实例而不是范围应该是对已经提出的设置的简单调整。但请考虑以下设置。

似乎有一些不同的方法来处理和处理模块/最终用户提供的数据。此逻辑现在在控制器中实现。有人可能会认为其中一些模块共享类似的处理方法(那里有很大的假设)。您可以将此逻辑移动到服务中,从而节省策略。在激活模块时,此模块将在处理提交按钮单击的服务中设置其首选保存策略。或者更确切地说,应该从控制器中的onClick处理程序调用保存数据方法。

现在,这些服务/战略可能会在控制器之间共享,可能会为更好的工作流程和更少的重复代码做好准备。