2014-10-29 5 views
5

Итак, рассмотрим следующий фрагмент из моей настройки маршрутизации angularUI. Я просматриваю маршрут/категорию/управление/4/подробности (например). Я ожидаю, что «категория» будет разрешена до того, как будет загружен соответствующий контроллер, и действительно, в той мере, в которой я могу поместить контрольную точку внутри функции разрешения, которая возвращает категорию из службы категории и видит, что категория была возвращена. Теперь, ставя еще одну точку останова внутри самого контроллера, я вижу, что «категория» всегда не определена. Он не вводится маршрутизатором пользовательского интерфейса.Угловой UI-маршрутизатор не разрешает вводимые параметры

Может ли кто-нибудь увидеть проблему? Это может быть где-то иначе, чем в коде, который я предоставил, но поскольку у меня нет ошибок при запуске кода, невозможно определить, где может быть источник проблемы. Типичные неудачи!

 .state('category.manage', { 
      url: '/manage', 
      templateUrl: '/main/category/tree', 
      controller: 'CategoryCtrl' 
     }) 
     .state('category.manage.view', { 
      abstract: true, 
      url: '/{categoryId:[0-9]*}', 
      resolve: { 
       category: ['CategoryService', '$stateParams', function (CategoryService, $stateParams) { 
        return CategoryService.getCategory($stateParams.categoryId).then(returnData); //this line runs before the controller is instantiated 
       }] 
      }, 
      views: { 
       'category-content': { 
        templateUrl: '/main/category/ribbon', 
        controller: ['$scope', 'category', function ($scope, category) { 
         $scope.category = category; //category is always undefined, i.e., UI router is not injecting it 
        }] 
       } 
      }, 
     }) 
      .state('category.manage.view.details', { 
       url: '/details', 
       data: { mode: 'view' }, 
       templateUrl: '/main/category/details', 
       controller: 'CategoryDetailsCtrl as details' 
      }) 

ответ

13

Концепция работает. Я создал working plunker here. Изменения здесь

вместо этого

resolve: { 
    category: ['CategoryService', '$stateParams', function (CategoryService, $stateParams) { 
     //this line runs before the controller is instantiated 
     return CategoryService.getCategory($stateParams.categoryId).then(returnData); 
    }] 
}, 

Я только что вернулся результат getCategory ...

resolve: { 
    category: ['CategoryService', '$stateParams', function (CategoryService, $stateParams) { 
     return CategoryService.getCategory($stateParams.categoryId); // not then 
    }] 
}, 

с наивной реализации услуг:

.factory('CategoryService', function() {return { 
    getCategory : function(id){ 
    return { category : 'SuperClass', categoryId: id }; 
    } 
}}); 

даже если это будет обещание ... разрешение будет ждать, пока оно не будет обработано ...

.factory('CategoryService', function($timeout) {return { 
    getCategory : function(id){ 
    return $timeout(function() { 
     return { category : 'SuperClass', categoryId: id }; 
    }, 500); 
    } 
}}); 
+1

Спасибо! Совершенно верно. Странная часть заключается в том, что я использую этот синтаксис с сервисом $ http и всегда работал нормально, и учитывая, что моя служба категории возвращает обещание, я предположил, что он будет работать одинаково. Мне нужно разобраться в чем разница, но еще раз спасибо за вашу помощь. Очень признателен. –

+0

Я не видел никакой документации об этом использовании. и в документе показано, что объект разрешения имеет ключ, фабричный. и фабрика принимает только строку или функцию ... – Demonbane

+0

Наконец-то я смог решить свою проблему с помощью этого решения. Благодаря! –

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