【问题标题】:Separating business logic from controller in AngularJS在AngularJS中将业务逻辑与控制器分离
【发布时间】:2015-05-15 23:24:04
【问题描述】:

我遇到过很多文章,这些文章展示了如何将业务逻辑与控制器分离并将它们放在不同的层中。至于 Angular,我们将所有逻辑添加到我们的服务、工厂等中。

但是我遇到了下面这行代码

angular.module('myApp').controller(function($scope,$userService) {    
  $scope.users = $userService.get('/users');    
  $scope.add = function() {
    // do something
  };    
});

人们仍然认为我们仍在控制器中添加逻辑。如果这是真的,那么在我的控制器中初始化数据的最佳方法是什么,这样我就可以避免在我的控制器中使用逻辑或任何可以帮助我实现这些的最佳实践。

P.S 我严格要求 Angular 的建议。

【问题讨论】:

  • 我只是想在控制器中绑定数据(数据和函数),所有其他逻辑都保留在服务中。因为我认为只有在页面上显示数据的逻辑。

标签: angularjs model-view-controller


【解决方案1】:

控制器中肯定存在“逻辑”,但逻辑应仅限于定义 ViewModel 并通过对来自 View 和来自 Model 的事件做出反应来更改它。

逻辑处理应用的状态,或控制器对其具有权威性的应用视图的一部分。

应该在控制器中的逻辑与后端知识、模​​型数据的操作、视图/DOM的操作、与数据为演示而准备。

您的示例很好,除了"/users" 部分,它可以从服务中抽象出来。

【讨论】:

    【解决方案2】:

    在给出的代码示例中,您可以使用资源 (https://docs.angularjs.org/api/ngResource/service/$resource) 来抽象 URL 详细信息。代码可能如下所示:

    angular.module('myApp').controller(function($scope,Users) {    
      $scope.users = Users.query();    
      $scope.add = function() {
        // do something
      };    
    });
    

    我假设 add 函数使用模板链接到 ng-click 事件,在这种情况下看起来没问题。如果在 // 做某事 的地方有很多代码,那可能会被移到服务中。

    取自 AngularJS Docs:

    控制器是“类”或“构造函数”,它们是 负责提供支持的应用程序行为 模板中的声明性标记。

    根据经验,如果不是应用程序行为,例如更新模型、处理点击事件等,然后抽象成服务。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-23
      • 2013-12-15
      • 2017-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-28
      相关资源
      最近更新 更多