Angular.js使用服务时控制器中的方法重复

时间:2015-09-05 10:03:08

标签: javascript angularjs proxy controller

我创建了一个<% @partners.each do |partner| %> Up to <%= @limits[partner.id].limit %> visits per month <% end %> ,用于存储(BookService),获取(add)和删除(getAll)本书。现在我想在我的控制器中使用这个BookService来发布一些我以后可以在我的视图中使用的方法。我的控制器如下所示:

remove

如您所见,控制器只是将方法调用转发给服务的代理。这一般是不好的做法吗?有没有更好的方法来使用app.controller('BookController', ['BookService', '$scope', function(BookService, $scope) { $scope.addBook = function() { BookService.add(); } $scope.getAllBooks = function() { BookService.getAll(); } $scope.removeBook = function() { BookService.remove(); } }]); 来解决这个问题?在没有控制器的情况下直接从视图中调用服务似乎对我来说是一个更大的问题。

3 个答案:

答案 0 :(得分:2)

最佳实践

从我可以看到这是非常好的做法,我假设您在这里使用$scope将这些服务绑定到按钮或类似的东西。使用工厂或服务的想法是创建一些组织良好的可重用代码,然后您可以在控制器中实例化,就像您一样。

控制器可能变得非常复杂,因此将基本功能移动到您的服务是最好的事情。在您的情况下,您有一个相对简单的控制器,因此您可能无法以这种方式看到编码的好处。但我向你保证,随着你的代码库的增长,你需要像这样编写代码以保持可读性。

注意

作为额外的注意事项,我添加了一个数据流程,您可以使用数据库请求的示例

database > API > service/factory > controller > view

这是从数据库请求内容时要采取的正确路径。

答案 1 :(得分:1)

你所展示的并不是不好的做法;事实上,建议您将资源管理逻辑(如添加,删除和查找相同类型的资源)抽象到单独的服务中,以实现组织和可维护性以及可重用性。

我从你的例子中了解到控制器似乎只是服务的代理,以及为什么你会认为它是重复的并且可能是多余的。让我扩展您的示例,看看我是否可以解释抽象逻辑的原因。在这样做时,我们只考虑添加操作,即使逻辑也适用于其他操作。

原因1:在网络应用中添加图书(或任何资源)通常比bookService.add()电话更复杂。它需要具有某种形式来输入细节,提交按钮以处理实际请求,可能按摩输入的数据,添加新字段(如时间戳和作者ID),并持久保存到某些数据存储。这些步骤中的前两个或三个步骤适用于您要添加的屏幕或视图,因此将它放在控制器(视图模型)中是有意义的,而其余步骤应该进入通用服务

现在说你有另一个屏幕,你可以看到朋友的书籍列表,你可以通过选择一本书将它添加到你的列表中。在这种情况下,该视图控制器的控制器逻辑将与前一个示例不同,但服务步骤仍然相同,因此不需要复制,因为可以将服务注入到两个控制器中。

这是一个很大的胜利。

示例2:假设您已经在控制器和服务之间拆分了代码,如上面的示例1中所述。然后,您决定数据存储需求已更改,现在您要更新逻辑以保存到其他数据库系统。现在,您无需更改所有控制器,只需更改服务,一切正常。

这也是一个非常大的胜利。

答案 2 :(得分:0)

是的,你正确地做到了这一点。请记住,当您在复杂性中扩展应用程序时,您需要将隔离范围(和)分解为组件指令。每个指令都有自己的控制器和模板片段。