javascript - 在 Angular JS 中根据 Controller 逻辑创建服务

标签 javascript angularjs angular-services

我目前有很多重复的逻辑,需要在许多不同的 Controller 中使用,并且我正在寻找一种更干燥的方法来做事。

例如,我目前有大约 12 个 Controller ,每个 Controller 都使用延迟加载函数。任何时候我想要调整该功能时,我都必须检查所有 12 个功能(我知道这并不聪明!)这就是常见版本的样子:

    $scope.number = user.channel_id;
    activityFactory.query({channelID: user.channel_id}, function(data){
      // the page number
      $scope.page=1;
      $scope.isInfinitScrollDisabled=false;
      // function for inifinite scroll
      $scope.getNextPage=function(){
        $scope.page++;
        $scope.isInfinitScrollDisabled=true;
        // query for the next page
        activityFactory.query({
          channelID: $scope.number,
          page: $scope.page
          }, function(data){
            $timeout(function(){
                      $scope.isInfinitScrollDisabled=false;
            },2000);
            $scope.activities.results = $scope.activities.results.concat(data.results);
        });
      };
       $scope.activities = data;
    });

正如您所看到的,如果没有此功能,我将拥有一个更干净且可读的 Controller ,并将大量业务逻辑移至服务中。 IE:

    activityFactory.query({channelID: user.channel_id}, function(data){
       $scope.activities = data;
    });

问题是我不太确定如何将其转换为可重复使用的格式。我刚开始:

  .service('lazyLoaded', ['', function(){
      // the page number
      $scope.page=1;
      $scope.isInfinitScrollDisabled=false;
      // function for inifinite scroll
    var getNextPage = function(){
      $scope.page++;
      $scope.isInfinitScrollDisabled=true;
      // query for the next page
        activityFactory.query({
          channelID: $scope.number,
          page: $scope.page
          }, function(data){
            $timeout(function(){
                      $scope.isInfinitScrollDisabled=false;
            },2000);
            $scope.activities.results = $scope.activities.results.concat(data.results);
        });
      };
  }])

但是我不确定我是否应该传递 $scope 或如何处理不同的资源,因为并非所有内容都是scope.activities,或者我可能不需要传递channelID:scope.number作为参数。这样的东西是如何构造的?

最佳答案

您不需要将范围传递到服务中。相反,您移入工厂的一些作用域变量仍然可以从 Controller 的作用域访问:

.factory('LazyLoaded', function() {
    var lazy = {
        page: 1
    };

    lazy.someFunction = function() {
        console.log('method called');
    };

    return lazy;
})

.controller('MyController', function($scope, LazyLoaded){
    $scope.lazy = LazyLoaded;
    console.log($scope.lazy.page); // logs 1
    $scope.lazy.someFunction(); // logs 'method called'
})

关于javascript - 在 Angular JS 中根据 Controller 逻辑创建服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23940002/

相关文章:

javascript - $scope.$watch value 包含在 Promise $q.when(value) 中

javascript - Bootstrap scrollspy 与 ng-show 不能很好地配合

javascript - 解析对象的 JSON 数组 : undefined property

c# - Web API 2 POST 请求返回 null

javascript - 你们能帮我用 jasmine 为下面的代码编写测试用例吗

javascript - 无法使用 "this"定义方法

javascript - 具有 Backbone 样板的 PubSub?

javascript - 使用 mangojs 模块时出现错误 "this._initialize is not a function"

javascript - AngularJS promise 解析在下一次用户交互之前不会更新 GUI

angular - 服务中保存的数据在页面刷新或更改时丢失