谁负责调用 $http?服务还是控制器?

Who's responsibility to call $http? Service or Controller?

作为后端开发人员,我在 Angular UI MVC 概念上有点挣扎。

我正在尝试与我的后端 MVC 进行比较,以便我可以更好地理解 Angular 背后的心态。

在我的后端,我有与存储库(或 DAO(Data Access O对象)我们过去如何称呼它们),控制器调用服务来完成工作(因为它们只传输数据而不做繁重的工作)并与客户端(即浏览器)交谈,我的模型是(DTOs)的组合(Data Transfer Objects)和 ORM 的实体)。

因为我天生就受到后端仅 return/accept JSON 的启发(拒绝 JSP、FreeMarker、Velocity 和所有其他让我的测试生活变得如此艰难的东西) .我会说在我的后端我只有 Model-Controller。从后端的角度来看,我的 View 是 AngularJS 作为 JSON 数据 我 return 可以标记为我的 Model 但绝对不是我的 View.

现在当我开始考虑 UI MVC as of AngularJS 我不明白谁应该使用 $http 服务与后端通信.散布在网络上的无数例子对我没有帮助。它们要么过于简约,要么没有在完整的上下文中显示 $http 的用法(只是从控制器中调用)。

我可以很容易地为两者争辩。

案例A:如果AngularJS将后端视为模型那么它是angular的责任调用 $http 与后端对话以获取 retrieve/post 数据的服务。这里 angular 控制器仍然充当 ViewModel 之间的基本传输,偶尔调用服务从后端获取和处理数据。

案例 B 我还可以说,等等 - "no",如果 angular 的控制器角色仅仅是传输那么他们应该从后端获取数据并传送到所需的目的地,即 angular 的 service/view(如果不需要进一步处理)。

那么 "right" 是哪一个?或者至少被 UI/fullstack 开发者广泛接受?

控制器应该仅以尽可能少的方式将数据和逻辑与视图连接起来。笨重的控制器表明要么需要拆分视图,要么需要将逻辑抽象为服务。 $http 调用绝对属于服务。控制器不关心数据是如何来的,只关心它来了。所以:

// controller doesn't care how
getData().then(function(data) {

对比:

// controller is too concerned with "how"
$http.get('/the/path').then(function(data) {

通常会在示例代码中看到 $http 调用控制器,但在专业生产代码中却看不到。

我强烈建议案例 A:在服务中使用它。

将 Angular 控制器视为拥有它们所分配到的每个特定视图,以及为这些控制器提供现成功能的服务。

另请注意,单个页面可以有多个视图,每个视图都可以绑定到其自己的给定控制器实例。因此,将基于 $http 的函数等实例化多次是没有意义的。对于服务,它将被实例化一次,然后在注入它的任何控制器之间共享。这也是在控制器之间共享数据的好方法,也是为任何给定任务使用服务的最重要原因之一。

另一个建议是,将 Angular 视为 MVC 可能会导致问题。 Angular 足够灵活,可以遵循多种设计模式,因此有 MVW(Model View Whatever)的绰号,但我见过的大多数应用程序都倾向于遵循 MVVM 模式。出于这个原因,我会说控制器在大多数情况下永远不应该知道 $http。