Мне нужно показать результаты нескольких вызовов на сервер REST на странице с помощью функции AngularJS.Как я могу создать данные модели в службе Angular JS или контроллере с несколькими вызовами?
Первый звонок получает информацию о продукте, который сам содержит идентификаторы других продуктов.
Я хочу отобразить детали этого продукта, но мне также нужно, чтобы каждый из зависимых продуктов запрашивался в обратном порядке и отображал некоторые детали каждого на одной странице, разделенные по категориям.
код шаблона ниже
<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'});
}]);
services.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 с асинхронным наклоном, так что, возможно, нет!
Спасибо за быстрый ответ :) К сожалению, это не работает. Сразу же после первого вызова $ resource устройство все еще не определено, поэтому цикл не запускается, и устройство возвращается без изменений. Должен ли я использовать код угловых обещаний явно? Я изо всех сил пытаюсь понять это, в частности, именно там, где я верну данные обратно к шаблону, как и когда вводить в эту область. –
И вот отсутствие кофе-шоу! Конечно, это сработало бы так - мои извинения. Код, который я предложил, никогда бы не работал независимо, потому что это фабрика - это не возвращает обещание, оно возвращает объект с помощью метода .get, который вы назовете для получения обещания. Я думаю, вы все равно можете выполнить то, что я собираюсь здесь, используя метод .then, доступный по обещанию начать второй набор вызовов, когда первое обещание будет выполнено, но мне нужно подумать об этом. –
Тбанки снова за вашей помощью. Я получил эту работу, используя подход обратного вызова типа пирамиды, так как я спешил, чтобы закончить работу. Учитывая больше времени, я буду искать обещания. –