Model view controller 如何看待angularjs中的控制器

Model view controller 如何看待angularjs中的控制器,model-view-controller,angularjs,controller,Model View Controller,Angularjs,Controller,我正在用Angularjs揭开面纱,我想我应该通过SO的优秀人士提出一个概念性的问题。这是一个经验丰富的开发人员提出的新手问题 应用程序具有仪表板要求。。。显示应用程序许多部分内容的单个页面。不同的用户类型获得不同的仪表盘。我们已经有了一个遗留后端,因此第一个任务是构建仪表板,以显示来自新RESTful服务层的许多信息 我想知道我应该如何从概念上考虑支持这一点所需的控制器 第一个问题是。。。它们应该以模型为中心还是以视图为中心?换句话说,它们是否应该是“以视图为中心”的控制器,其中包含“仪表板”

我正在用Angularjs揭开面纱,我想我应该通过SO的优秀人士提出一个概念性的问题。这是一个经验丰富的开发人员提出的新手问题

应用程序具有仪表板要求。。。显示应用程序许多部分内容的单个页面。不同的用户类型获得不同的仪表盘。我们已经有了一个遗留后端,因此第一个任务是构建仪表板,以显示来自新RESTful服务层的许多信息

我想知道我应该如何从概念上考虑支持这一点所需的控制器

第一个问题是。。。它们应该以模型为中心还是以视图为中心?换句话说,它们是否应该是“以视图为中心”的控制器,其中包含“仪表板”一词?或者他们应该更关注他们所代表的模型元素,比如“任务”、“联系人”、“通知”。或者在仪表板控制器与以模型为中心的控制器一起工作时,是否应该同时存在这两种控制器

下一个问题是。。。控制器应该代表什么级别的粒度?如果是以视图为中心的“仪表盘”控制器,它们应该是“ManagerDashboardController”和“WorkerDashboardController”吗?如果是以模型为中心的控制器,是否应该有诸如“LateTasks”和“OnTimeTasks”之类的控制器,因为我需要在仪表板的不同部分显示它们,数据略有不同


我正在根据现实世界的经验和/或对我尚未找到的重要链接的引用,寻找切实可行的建议。

基本想法

因此,我实际上正在利用AngularJs将遗留代码库迁移到基于restful的web服务体系结构

控制器负责管理网页视图所使用的数据。我个人的偏好是,控制器和它所服务的视图之间存在一对一的关系。因此,基于这个问题,角度控制器应该更加以视图为中心。但我相信会有很多人不同意我的观点

如果您担心此模式的可扩展性,那么应该将业务逻辑和数据访问放在其中。这为您提供了大量业务逻辑操作的重用以及单元可测试性

TLDR

角度传感器的规格一直在变化,每一个新版本都会有一个新的标准。更以视图为中心的体系结构似乎适合此应用程序

有关这一主题的更完整的阅读,我建议您查看:


    • 这是非常主观的,但这是我对您的问题的回答

      控制器应该以模型为中心还是以视图为中心?

      视情况而定(一如既往),我总是尝试为页面的不同部分使用小型控制器

      页面的某些部分非常以视图为中心(通常是在不同视图之间共享的部分)。我通常有一个菜单、一个headerCtrl和一个footerCtrl。此CTRL与页面的这些部分非常耦合,因此可以使它们以视图为中心

      视图的其他部分,即与业务相关的部分,更多地耦合到业务规则并扩展到模型,因此我将这些CTRL模型作为中心。在帐户的商业应用程序中,我可能会有accountCtrl、ownerCtrl等。通过这样做,如果需要的话,我可以在不同的视图上重用它们(并且更易于测试)

      控制器应代表何种粒度级别?

      尽可能最小的。尝试使用小型控制器为页面的不同部分准备模型。如果您有一个大型控制器,那么很难测试、维护,而且您可能会被迫在应用程序的不同部分复制代码

      与管制员的建议和建议

      保持它们小

      避免在它们内部进行DOM操作(改用指令)

      仅使用控制器准备模型。尽可能将应用程序的所有逻辑委托给服务。如果您这样做,那么您的控制器是以视图为中心还是以模型为中心其实就没那么重要了

      正如我之前所说,这是一个非常主观的问题,我相信很多人会不同意我的观点


      我希望这能对您有所帮助。

      以下是我对Angular在过去6个月内开发业务应用程序的看法:

      控制者的角色
    • 初始化(加载初始数据、设置选项)
    • 通过$scope向模板公开变量和函数
    • 应用程序流程(通过公开可更改状态的功能,或
      $watch
      es)
    • 我发现,就像传统的MVC框架一样,Angular应用程序中的控制器应该是超薄的控制器中应包含少量业务逻辑,而应封装在模型中。我是在听了米什科·赫弗利的演讲后得出这个结论的:这是我从那次演讲中得到的最有价值和启发性的一句话(尽管我建议观看整个视频);这条线直接导致我的控制器瘦了将近50%-70%

      例如,我的公司有一个
      订单
      的概念。我创建了一个模型,该模型封装了这个业务对象的所有属性及其行为,并将它们注入到控制器中。我们的一个业务规则是能够将
      预订
      (另一个业务对象)添加到
      订单
      。最初在我的控制器中,我有一个
      $scope.addBooking
      函数,该函数首先创建了一个新的
      Booking
      ,然后接受订单并执行
      $scope.order.bookings.push(newBooking)
      。相反,我将此业务逻辑(
      addBooking
      函数)直接移动到