【问题标题】:switching between api and flat json in angularjs在angularjs中的api和flat json之间切换
【发布时间】:2014-08-10 17:49:21
【问题描述】:

我认为我的 stackoverflow search-fu 今天坏了,因为不可能只有我一个人问过这个问题。 Cripes,我希望不是,因为我真的可以使用一些帮助来解决这个问题。在数据源之间切换是很重要的部分,但“抽象的最佳方式”也是这方面合乎逻辑的下一个问题。

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

  1. 没有登录 = 虚拟数据/json
  2. 临时登录 = 来自删节端点的数据
  3. API 密钥 = 完整数据集端点

逻辑上,我将有 $scope.access 用于用户访问 + $scope.widget 用于用户单击的小部件。回到旧的功能习惯,似乎我可以在 case break 中使用这两个,并为适当的端点返回一个值。但我似乎无法获得一个变量来执行 $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);

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

非常感谢。

【问题讨论】:

  • 可以将逻辑分离成service?
  • ...然后调用我刚刚输入两个变量的服务并取回一些东西?这一切都从控制器中解脱出来,但我仍然需要手写端点逻辑吗?我只是希望有一种更有效的方法。
  • 那么可以考虑使用$http的拦截器。
  • 现在谷歌搜索。谢谢!

标签: json angularjs angular-http


【解决方案1】:

正如@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;
});

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

【讨论】:

  • 谢谢!这让我走到了一半,但现在我不知道如何让它使用复选框而不是单选按钮。请参阅plnkr.co/edit/C83MFP 当用户可以选择多个小部件(每个小部件都有自己的端点)时,不确定如何开始工作。有没有办法在不丢失其他呼叫结果的情况下重复该操作?还是我的理解正确,我不能用单身人士做到这一点?
  • 根据你的笨拙提出一些 hacky plnkr.co/edit/mWWciY 另见 docs.angularjs.org/guide/providers
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多