我需要使用 AngularJS 在页面中显示多次调用 REST 服务器的结果。
第一个调用获取产品的详细信息,该产品本身包含其他产品的 ID。
我想渲染这个产品的详细信息,但我还需要在后面查询每个依赖的产品,并在同一页面上显示每个产品的一些详细信息,按类别划分。
模板代码如下
<div class="span6">
<div class="well">
<h2>product details</h2>
</div>
<div class="well">
<h3>{{device.product.brand}} {{device.product.model}}</h3>
<p>SKU: {{device.product.sku}}</p>
<div ng-repeat="reltype in ['plan', 'insurance', 'dataallowance']">
<h3>{{reltype}}</h3>
<ul>
<li ng-repeat="rel in relationships | filter: {type:reltype}">
<a href="#/product/{{rel.relId}}">{{plan.type}} {{plan.family}}</a>
<p> {{plan.marketingMessage}}</p>
</li>
</ul>
</div>
</div>
</div>
我的 app.js:
angular.module('prodcat', ['prodcatServices']).
config(['$routeProvider', function($routeProvider, $locationProvider) {
$routeProvider.
when('/products', {templateUrl: '/prodCatVisualiser/partials/device-list.html', controller: ProductListCtrl}).
when('/product/:id', {templateUrl: '/prodCatVisualiser/partials/device-detail.html', controller: ProductDetailCtrl}).
otherwise({redirectTo: '/products'});
}]);
服务.js:
angular.module('prodcatServices', ['ngResource']).
factory('Devices', function($resource) {
return $resource('/prodCatVisualiser/ajax/products');
})
.factory('Device', function($resource){
return $resource('/prodCatVisualiser/ajax/product/:id');
});
和controllers.js:
"use strict";
function ProductListCtrl($scope,Devices) {
$scope.devices = Devices.query();
}
function ProductDetailCtrl($scope, $routeParams, Device) {
$scope.device = Device.get({id: $routeParams.id});
}
我尝试将 productDetailCtrl 方法更改为如下所示:
function ProductDetailCtrl($scope, $routeParams, Device) {
var plans = new Array();
$scope.device = Device.get({id: $routeParams.id}, function($scope, plans) {
var relationships = $scope.product.relationships;
for (var i=0; i < relationships.length; i++) {
var planDetail = Device.get({id: relationships[i].relId}, function($scope, plans){
plans.push(planDetail);
});
}
});
$scope.relationships = plans;
}
但无济于事。由于第一次调用,我似乎无法理解辅助服务调用的异步性。
那么控制器(和其中的一个函数)是进行所有服务调用并将它们放在一起的最佳位置吗?
或者当我迭代依赖产品时,模板使用控制器或服务进行额外的后端调用是否更好?这似乎违背了控制器将模型放在一起然后将其传递到要渲染的视图的通常的 MVC 范例。但是 Angular 是带有异步倾斜的 MVC,所以也许不是!