在AngularJS中,我们如何决定拥有一个或多个控制器?

在AngularJS中,我们如何决定拥有一个或多个控制器?,angularjs,angularjs-controller,Angularjs,Angularjs Controller,假设一个页面的左面板有一些项目可供选择,而右侧有一个“购物车”面板,那么最好有两个控制器:一个用于左面板,一个用于右面板 实际上,为了共享数据并能够使用来自两个控制器的数据,我们可以为左侧面板设置一个,然后立即为“cart”(嵌套两个控制器)启动另一个,这样我们就可以“混合并匹配”itemController.foo和cartController.bar(使用“控制器作为”语法) 但是在JavaScript代码中,如果我们需要共享数据,则需要一个工厂服务或使用$rootScope.sharedD

假设一个页面的左面板有一些项目可供选择,而右侧有一个“购物车”面板,那么最好有两个控制器:一个用于左面板,一个用于右面板

实际上,为了共享数据并能够使用来自两个控制器的数据,我们可以为左侧面板设置一个
,然后立即为“cart”(嵌套两个控制器)启动另一个
,这样我们就可以“混合并匹配”
itemController.foo
cartController.bar
(使用“控制器作为”语法)

但是在JavaScript代码中,如果我们需要共享数据,则需要一个工厂服务或使用
$rootScope.sharedData
对象。那么,为什么不使用1个控制器而不是2个控制器,这样数据共享就不会成为问题了?但假设我们使用2个控制器,如果用户是“公司协调员”,则页面有一个特殊情况,因此他或她可以每周进行多次购买(而不是一般用户每周仅限1次购买),因此我们需要在页面中进行一些特殊处理,我们是否应该创建另一个名为
CompanyCoordinatorController
的控制器

O'Reilly的书AngularJS Up and Running,2014,在第。18:

AngularJS控制器几乎总是直接链接到视图或HTML。我们永远不会有一个不在UI中使用的控制器(这种业务逻辑进入服务)

所以看起来有两个控制器是有意义的?我们可以说,它是页面上的一个大视图,因此我们只使用一个控制器吗?这将是非模块化的,并且不遵守“关注点分离”(产品列表与购物车)?问题是,我们应该什么时候在AngularJS页面中创建控制器

视情况而定

但说真的,这是一个设计决策,你必须让自己、你的团队以及那些在你离开后负责维护你的代码的人做出决定。您需要将组件模块化吗?在我看来,你似乎已经在这方面花了很多心思,但不确定要做出什么选择

不会有一个正确的答案,你在这里得到的任何答案(包括我的答案)都是有偏见的、主观的,而且可能对你不起作用。我的建议是用一种方法试试看是否有效。如果没有,重构它。在我个人看来,我更喜欢通过发布子服务相互通信的模块化组件。但同样,这可能不适用于您当前的项目。在做出决策时,考虑可行性、成本和可维护性

干杯

视情况而定

但说真的,这是一个设计决策,你必须让自己、你的团队以及那些在你离开后负责维护你的代码的人做出决定。您需要将组件模块化吗?在我看来,你似乎已经在这方面花了很多心思,但不确定要做出什么选择

不会有一个正确的答案,你在这里得到的任何答案(包括我的答案)都是有偏见的、主观的,而且可能对你不起作用。我的建议是用一种方法试试看是否有效。如果没有,重构它。在我个人看来,我更喜欢通过发布子服务相互通信的模块化组件。但同样,这可能不适用于您当前的项目。在做出决策时,考虑可行性、成本和可维护性


干杯

一个控制器只有在该控制器或视图的部分可以在其他地方重用的情况下才真正是非模块化的。你们甚至还并没有提到嵌套控制器,所以这个问题实在太宽泛了,而且只对固执己见的人开放answers@charlietfl大约35年前,当我第一次开始编程时,事情也是“取决于你选择如何做。”然后我在大学里上了一堂Pascal课程,突然,它给出了一种“自上而下”的方法,即将工作划分为更小的步骤,然后将这些步骤(作为过程或功能)实施,如果任务太大,也将其分解。每个过程或函数都有自己的作用域,尽量不要使用全局。。。[续]。。。事情变得非常清楚。我认为AngularJS可能有类似的方法,或者一个经验丰富的AngularRJS人员可以告诉你一种方法,“作为最佳实践,它可以这样做…”可能会有帮助,如果控制器或视图的部分在其他地方可重用,那么一个控制器只能是非模块化的。你们甚至还并没有提到嵌套控制器,所以这个问题实在太宽泛了,而且只对固执己见的人开放answers@charlietfl大约35年前,当我第一次开始编程时,事情也是“取决于你选择如何做。”然后我在大学里上了一堂Pascal课程,突然,它给出了一种“自上而下”的方法,即将工作划分为更小的步骤,然后将这些步骤(作为过程或功能)实施,如果任务太大,也将其分解。每个过程或函数都有自己的作用域,尽量不要使用全局。。。[续]。。。事情变得非常清楚。我认为AngularJS可能有这样的方法论,或者一个经验丰富的AngularJS人员可以告诉你一种方法,“作为最佳实践,它可以这样做…”可能会有所帮助