在angularjs中切换api和flat json

时间:2014-08-10 17:49:21

标签: json angularjs angular-http

我认为我的stackoverflow search-fu今天已经破了,因为我不是唯一一个曾经问过这个问题的人。 Cripes,我希望不是,因为我真的可以使用一些帮助搞清楚这一点。在数据源之间切换是最重要的部分,但“抽象的最佳方式”也是下一个问题。

无论如何:我有三十个小部件。每个小部件都有三个数据源之一(API-full,API-short,json文件)。我将让用户刚从intarnet,带有销售提供的临时登录的用户以及使用自己的API密钥登录的用户进入。

  1. no login = dummy data / json
  2. temp login =来自删节端点的数据
  3. API密钥=完整数据集端点
  4. 记录下来,我将为用户访问+ $ scope.widget提供$ scope.access,用户点击该窗口小部件。回到旧的功能习惯,似乎我可以在案例中断中使用这两个,并为适当的端点返回一个值。但我似乎无法获得一个变量来处理$ 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);
    

    其余部分隐藏在引擎盖下。关于如何解决这个问题的任何想法?

    非常感谢提前。

2 个答案:

答案 0 :(得分:0)

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

许多选项之一是您为某个地方的每个用户类型存储API端点(例如,在角度常量中),然后使用与您服务中的用户访问权限级别相匹配的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;
});

我希望你明白了。简单的Plunker http://plnkr.co/edit/GLmVmh

答案 1 :(得分:0)

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

https://github.com/seriema/angular-apimock