在AngularJS中通过AJAX延迟加载嵌套和链接资源?

时间:2015-08-28 20:11:45

标签: ajax json angularjs rest json-ld

我正在寻找已经存在的javascript库(AngularJS模块)或者至少是一种最佳实践技术,用于在视图需要时自动加载嵌套资源,给定已加载的父资源

以下是一个示例,并假设用户实际上来自某些REST API,通过ajax。



var app = angular.module('app', [])
  .controller('TestController', function($scope, $http) {
    $scope.user = {
      name: "John Smith",
      creditCard: {
        "network": "Visa"
      }
    };
  });

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="app">
  <div ng-controller="TestController">{{user.creditCard.network}}</div>
</div>
&#13;
&#13;
&#13;

现在假设用户,信用卡和其他资源太大,无法在一个api呼叫中加载所有资源。也就是说,我不想发送连接到用户的整个资源图表。如果我包含用户&#34;朋友&#34;默认情况下收集,这可能是我的整个数据库!!

我知道json-ldjson-hal开始进入,因为他们超链接&#34;资源本身。如果我要使用HAL:

&#13;
&#13;
var app = angular.module('app', [])
  .controller('TestController', function($scope, $http) {
    $scope.user = {
      "_links": {
        "self": {
          "href": "/api/v1.0/user/1231213"
        },
        "creditCard": {
          "href": "/api/v1.0/creditCard/324324234"
        },
      },
      name: "John Smith"          
    };
  });
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="app">
  <div ng-controller="TestController">{{user.creditCard.network}}</div>
</div>
&#13;
&#13;
&#13;

有了这个,我当然可以手动$ http请求有关信用卡的详细信息(知道我需要显示有关信用卡的信息):

&#13;
&#13;
$http({
  url: user._links.creditCard.href
}).success(function(resp) {
  user.creditCard = resp;
});
&#13;
&#13;
&#13;

现在,这是我的问题:这是一个好主意,如果是这样,如何(使用现有的AngularJS库或其他方式)获取任何嵌套资源(如creditCard),只有当AngularJS看到我需要它时才会自动加载在一个视图中?当视图要求数组中成员的属性,以及控制器不必知道数据的结构/模式(仅视图)时,这一点尤为重要。

复杂的例子:如果我需要user.creditCard.transactions [i] .recipient.name并且我只有root用户对象(并且通过HAL我知道用户有一个creditCard嵌套对象)怎么办?此技术/库需要先协调信用卡,然后是交易,然后是收款人。

我还在权衡这个问题是否带来好处,因为原始方案是1个API调用并且可能是一个巨大的响应,而可能是几十个或几百个API调用,每个调用都有一个小的负载,最糟糕的是与前者相同的聚合尺寸。

提前致谢!

更新:我正在调查角度资源($资源)和Restangular,不确定他们是否会在那里得到50%或100%。

额外信用:如果我真的想要进一步优化并进一步优化...让我们说用户和收件人之间的每个父对象都太重了,REST API是完全嵌套。也就是说,我可以直接调用/ user / 1 / creditCard / transactions / recipients或其他东西并获取收件人资源。上述建议可能会使用拦截器或其他什么来代替吗?

0 个答案:

没有答案