1

Я настраиваю приложение AngularJS, и у меня есть небольшая проблема, гарантирующая, что мои обещания стреляют до загрузки контроллеров. Я понимаю, что это можно сделать. Немного кода:AngularJS: Маршруты с несколькими разрешениями с использованием Сервисов не срабатывают

Во-первых, вот код маршрутизатора:

$routeProvider 
 
    .when('/apage', { 
 
     controller: 'APageController', 
 
     templateUrl: 'app/apage/apage.view.html', 
 
     requiresLogin: true, 
 
     resolve: { 
 
      "data": function($q, data1Service, data2Service) { 
 
       var data1 = data1Service.getData(); 
 
       var data2 = data2Service.getData(); 
 
       return $q.all({ 
 
        data1: data1.$promise, 
 
        data2: data2.$promise}); 
 
      } 
 
     } 
 
    }) 
 
...

Вот одна из сервисных функций (как похожи) ...

function getData() { 
 
    var deferred = $q.defer(); 
 
    $http(req) 
 
     .success(function(data, status, headers, config) { 
 
      // store data ... 
 
      deferred.resolve(1); // just a flag to say it worked 
 
      $rootScope.$apply(); 
 
     }) 
 
     .error(function(data, status, headers, config) { 
 
      deferred.resolve(0); 
 
      $rootScope.$apply(); 
 
     }); 
 
    return deferred.promise; 
 
}

А вот код контроллера ...

angular 
 
    .module('app') 
 
    .controller('APageController', APageController); 
 
    
 
    APageController.$inject = [... 'data']; 
 
    function APageController(... data) { 
 
     var data1 = data.data1; 
 
     var data2 = data.data2; 
 
     ...

Все три находятся в разных файлах, но часть того же модуля. Должна быть какая-то концепция, которую я пропускаю. Есть ли что-нибудь очевидное здесь, чтобы объяснить, почему мои обещания о решении не стреляют?

спасибо.

ответ

1

Если вы передадите объектный литерал q.all, он решит проблему немедленно. Вместо этого передайте массив обещаний, чтобы он решил разрешить отклонение. Также .$promise не требуется в вашем случае, потому что вы уже возвращаете обещание от своего сервиса (на основе отображаемого кода). $promise обычно прикреплена с помощью объекта, возвращенного $resource

т.е.
return $q.all([data1Service.getData(), 
       data2Service.getData()]); 

и ожидать data быть массивом данных, разрешенных свыше 2 вызовов.

или создать 2 рассасывается:

resolve: { 
     "data": function($q, data1Service, data2Service) { 
      return data1Service.getData(); 
     }, 
     "data2": function($q, data1Service, data2Service) { 
      return data2Service.getData(); 
     }  
    } 

и инъекционные data и data2.

в противном случае, проследите и измените формат ответа, чтобы ожидать, как вы изначально пытались добраться.

resolve: { 
     "data": function($q, data1Service, data2Service) { 
      return $q.all([data1Service.getData(),data2Service.getData()]) 
        .then(function(response){ 
        return { 
          data1:response[0], 
          data2:response[1] 
          }; 
       }); 
     } 
    } 

Не оставляйте rootScope.apply внутри службы, то это вызовет переваривать уже в ходе ошибки (так как угловой воли). $http автоматически разрешит его.

Вам просто нужно это.

function getData() { 
    return $http(req); 
} 
+0

Спасибо PSL. Я сделал изменение, чтобы использовать массив, как вы предложили, и снова попытался, и я увидел следующую погрешность в архиве консоли: https://docs.angularjs.org/error/$rootScope/inprog?p0=$digest. Итак, я удалил инструкции rootScope из служб. Заявления о разрешении теперь запускаются, но ПОСЛЕ запуска контроллера. Итак, я попробовал вторую идею использования двух разрешений. К сожалению, это тот же результат: контроллер запускается до завершения разрешений. – Marshee

+0

@ Marshee ПОЧЕМУ вы используете *. $ Обещают? я только что видел ваше служение, вы просто уже возвращаете обещание. См. Мое редактирование. – PSL

+0

Я думал, что это будет правильно. Но вы правы. Я слишком многообещаю? Я удалил «. Обещание» из заявления о разрешении ... и ... вуаля ... он работает. Спасибо PSL за помощь! – Marshee

Смежные вопросы