2016-02-04 4 views
0

Ввод объекта возврата resolve, который должен быть введен в контроллер, но это не так. Я использую обещание, чтобы диспетчер не инициировал до тех пор, пока обещание не будет разрешено, поскольку я выполняю HTTP POST с помощью службы $http.AngularJS Зависимость впрыска в контроллере разрешения routeProvider

Я также делаю некоторое перенаправление в зависимости от данных ответа, используя $location.path. Первый маршрут будет перенаправлен на маршрут template1 с данными, которые он получил.

$routeProvider 
    .when("/auth/:id", amd.route(
    { 
     controller: 'eventController', 
     controllerUrl: 'app/controllers/eventController', 
     resolve: { 
      returnedData: ['$http', '$location', '$route', '$q', function ($http, $location, $route, $q) { 
       var id = $route.current.params.id; 
       var defer = $q.defer(); 
       $http({ 
        method: 'POST', 
        url: 'http://domain/service/webapi', 
        data: { 'name': id } 
       }).then(function (response) { 
        var template = "/template".concat(response.data.displayLayout); 
        defer.resolve(response.data); 
        $location.path(template); 
        return defer.promise; 
       }); 
      }] 
     } 
    })) 
    .when("/template1", amd.route(
    { 
     templateUrl: 'views/templates/template1.html', 
     controller: 'eventController', 
     controllerUrl: 'app/controllers/eventController', 
    })); 

app.controller('eventController', ['$scope', '$routeParams', '$timeout', 'returnedData', 
    function ($scope, $routeParams, $timeout, returnedData) { 
     // ...controller code here: $scope.returnedData = returnedData 
}); 

Я получаю ошибку AngularJS:

Error: $injector:unpr Unknown Provider

Любые мысли по этому поводу?

ответ

1

На странице AngularJS API, о routeProvider (https://docs.angularjs.org/api/ngRoute/provider/ $ routeProvider)

вы можете увидеть:

resolve - {Object.=} ... If any of these dependencies are promises, the router will wait for them all to be resolved or one to be rejected before the controller is instantiated

Вы должны изменить свой код, как показано ниже:

var id = $route.current.params.id; 
var defer = $q.defer(); 
$http({ 
    method: 'POST', 
    url: 'http://domain/service/webapi', 
    data: { 'name': id } 
}).then(function (response) { 
    var template = "/template".concat(response.data.displayLayout); 
    defer.resolve(response.data); 
    $location.path(template); 
}); 
// return the promise outside `then` method, then angularjs will wait it `resolve` 
return defer.promise; 

И далее, пожалуйста, обратите внимание:

Be aware that ngRoute.$routeParams will still refer to the previous route within these resolve functions. Use $route.current.params to access the new route parameters, instead.

+0

Отличный !! Теперь объект 'returnData' вводится в мой контроллер, когда строка' $ location.path (template) 'закомментирована. Проблема теперь в том, как передать результат разрешения с одного пути на следующий в $ routeProvider? –

+0

Если данные, которые вы разрешаете, являются сложными: Вы можете использовать 'Service' для этого. Потому что «Сервис» является уникальным в модуле, поэтому его можно легко использовать для передачи данных. Определите службу и введите оба пути. , если это очень просто: Вы можете напрямую использовать $ routeParams и поместить данные в следующий путь. Желание может помочь вам – Jelly

+0

Это сработало! Я создал службу непосредственно в модуле, используемом для маршрутизации, и поскольку службы являются одиночными в Angular, я могу повторно использовать его позже, чтобы извлечь данные из него. –

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