angularjs中api和平面json之间的切换

angularjs中api和平面json之间的切换,json,angularjs,angular-http,Json,Angularjs,Angular Http,我想我的stackoverflow搜索引擎今天坏了,因为我不可能是唯一一个问过这个问题的人。克里普斯,我希望不是,因为我真的需要一些帮助来解决这个问题。在数据源之间切换是最重要的部分,但“最佳抽象方式”也是下一个逻辑问题 不管怎样:我有大约三打小部件。每个小部件有三个数据源(API完整、API短、json文件)中的一个。我将有来自互联网的用户,销售人员提供临时登录的用户,以及使用自己的API密钥登录的用户 no login=dummy data/json temp login=来自简化端点的数据

我想我的stackoverflow搜索引擎今天坏了,因为我不可能是唯一一个问过这个问题的人。克里普斯,我希望不是,因为我真的需要一些帮助来解决这个问题。在数据源之间切换是最重要的部分,但“最佳抽象方式”也是下一个逻辑问题

不管怎样:我有大约三打小部件。每个小部件有三个数据源(API完整、API短、json文件)中的一个。我将有来自互联网的用户,销售人员提供临时登录的用户,以及使用自己的API密钥登录的用户

  • no login=dummy data/json
  • temp login=来自简化端点的数据
  • API键=完整数据集端点
  • 如果将其逻辑化,我将为用户访问设置$scope.access+$scope.widget,用户单击该widget。回到旧的函数习惯,我似乎可以在案例中断时使用这两个函数,并为适当的端点返回一个值。但我似乎无法获得一个变量来处理$http调用,如下所示:

    $http.get($scope.call).success(function(data) {
        $scope.group = data;
    });
    
    因此,我的问题归结为:

    最好的方法是(或者我可以)将$http与变量一起重新使用,这样我就可以插入变量,而不必为每个组合单独使用$http

    我应该(或者应该)如何抽象这个逻辑,并从我的控制器中获取它

    真正优秀的是我可以在控制器中调用的东西,可能是这样的:

    var X = getEndpoint($scope.access, $scope.widget);
    var Y = getEndpoint($scope.access, $scope.widget);
    var Z = getEndpoint($scope.access, $scope.widget);
    
    其余的都藏在引擎盖下的其他地方。有没有办法解决这个问题


    非常感谢。

    正如@runTarm在其评论中所说,您可以将API调用的逻辑封装在单独的服务中。是的,您可以使用拦截器来控制您的http调用

    许多选项之一是将每个用户类型的API端点存储在某个位置(例如,角度常数),然后使用与服务中用户访问权限级别匹配的端点。您的所有控制器/小部件都可以使用相同的服务,该服务包含确定端点的逻辑

    我知道我在这里简化事情,但是考虑一个基于访问级别的HTTP数据获取服务:

    app.factory('MyService', function($http, API){
      return {
          get: function(accessLevel) {
            var endPoint = (_.findWhere(API, { access: accessLevel })).endPoint;
            return $http.get(endPoint);
          }
       }
    });
    
    这将从给定访问级别确定的端点获取数据。这里API是一个常数:

    app.constant('API', [{ 
        access: 1, 
        endPoint: 'http://jsonplaceholder.typicode.com/posts'
      },{ 
        access: 2, 
        endPoint: 'http://jsonplaceholder.typicode.com/comments'
    }]);
    
    然后使用控制器中的服务,例如

    MyService.get($scope.accessLevel).then(function(data){
      $scope.response = data;
    });
    
    我希望你明白了。Simple Plunker here

    ApiMock是AngularJS的最小(1.68kb gzip)库,允许您通过将API调用路由到静态JSON文件来模拟RESTful API


    可以将逻辑分离成一个
    服务
    ?…然后调用该服务,在那里我只需输入两个变量并返回一些内容?这使它完全脱离了控制器,但我仍然需要直接执行端点逻辑吗?我只是希望能有一个更有效的方法。然后可以考虑使用<代码> $HTP的拦截程序。谢谢非常感谢。这让我走到了一半,但现在我不知道如何让它与复选框而不是单选按钮一起工作。请参阅不确定当用户可以选择多个小部件(每个小部件都有自己的端点)时如何开始工作。是否有方法在丢失其他通话结果的情况下重复该操作?或者我的理解是对的,我不能用一个单身汉来做这件事吗?根据你的想法做一些骇人的东西,你也看到了吗