在必须交互的控制器之间拆分功能

时间:2015-05-15 15:09:45

标签: angularjs angular-ui-router

我们正在使用Angularjs和ui-router。我们通常有一个利用视图的每个页面的布局。我们有一个过滤视图,排序视图和分页视图;以及可以换入和换出的显示视图。

逻辑上,当进行更改时,我们需要根据需要更新displayData所需的任何控制器。对filter的更改应该运行filterMethod,但之后还需要运行sort然后运行分页逻辑,而sort之后的更改应该只运行分页,为每个控制器需要更新时的操作做出明确的操作顺序。 / p>

我的问题出现在我认为在某些情况下我们可能不想使用所有3个控制器。我们可能想要过滤,但不是例如分页。

我们无法找到一种干净的方法来制作这些控制器并且只是工作,这样我们就可以在uirouter中插入我们想要的任何控件并让它们发挥作用。问题主要是范围界定。如果我做了显而易见的事情,让每个控制器在对其进行更改时定义自己的updateData方法,如果我希望它们调用下一个控制器的后续更新,我会遇到范围问题。过滤器控制器无法调用排序,因为两个控制器不共享范围。我可以使用广播,但如果我想要一个过滤器和一个分页控制器,但不是一种排序呢?如果两者都存在,我如何确保排序在分页之前运行,但如果排序控制器不存在,则分页知道在过滤后运行?

我可以将所有内容都移到我的顶级控制器上,然后就可以了。然而,我最终得到了一个控制器,感觉它已经做得很多,如果可能的话,为每种类型的控制器配备一个控制器更清洁。

我们可以使用其他方法,但他们觉得他们对我们的控制器方案做出了相当强烈的推测。如果我后来添加了第四个控制器,我将不得不修改所有内容,因为每个控制器都非常明确地硬编码,并假设其他控制器如何运行。

这似乎是一个常见问题。是否有最佳实践或方便的技术来处理跨控制器的功能分离?

1 个答案:

答案 0 :(得分:0)

提升数据,而不是显示逻辑。只有两种方法可以干净地在控制器之间共享数据:服务和父控制器。

如果你分享的是数据(例如:displayData),我可能会建议一个服务对象,但听起来更像应用程序状态(例如:orderBy),所以我认为这些“设置”应该住在父控制器上。