2013-06-28 2 views
1

Мне нужно показать результаты нескольких вызовов на сервер 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 с асинхронным наклоном, так что, возможно, нет!

ответ

0

Я бы справился с этим в службе. Что-то вдоль линий:

.factory('Device', function($resource){ 
    var device = $resource('/prodCatVisualiser/ajax/product/:id'); 
    for (var rel in device.relationships) { 
     rel.data = $resource(/prodCatVisualiser/ajax/product/:id).get({id: rel.relId}); 
    } 
    return device; 
}); 

(предупреждение - от кода манжеты, вероятно, содержит ошибку где-то, у меня не было кофе еще ... считают псевдокод)

Теперь, что ваш контроллер получает будет проходить через три состояния:

  1. обещания основных данных продукта
  2. выполнивших обещание для основных данных продукта, содержащий ожидающие обещания для каждого из отношений продуктов.
  3. Полностью выполненное обещание с данными для всех продуктов, которые необходимо отобразить.

Далеко не нарушая MVC, это поддерживает его. В представлении нет необходимости знать, что для получения этой информации требуется более одного вызова сервера. Это действительно сводится к тому, что вы считаете «реальным» контроллером в этом сценарии. В этом макете задача сервиса заключается в том, чтобы получить соответствующую модель, и все, кто находится ниже по течению, просто должны беспокоиться о том, что с ней делать.

+0

Спасибо за быстрый ответ :) К сожалению, это не работает. Сразу же после первого вызова $ resource устройство все еще не определено, поэтому цикл не запускается, и устройство возвращается без изменений. Должен ли я использовать код угловых обещаний явно? Я изо всех сил пытаюсь понять это, в частности, именно там, где я верну данные обратно к шаблону, как и когда вводить в эту область. –

+0

И вот отсутствие кофе-шоу! Конечно, это сработало бы так - мои извинения. Код, который я предложил, никогда бы не работал независимо, потому что это фабрика - это не возвращает обещание, оно возвращает объект с помощью метода .get, который вы назовете для получения обещания. Я думаю, вы все равно можете выполнить то, что я собираюсь здесь, используя метод .then, доступный по обещанию начать второй набор вызовов, когда первое обещание будет выполнено, но мне нужно подумать об этом. –

+0

Тбанки снова за вашей помощью. Я получил эту работу, используя подход обратного вызова типа пирамиды, так как я спешил, чтобы закончить работу. Учитывая больше времени, я буду искать обещания. –