2014-10-29 12 views
5

Rozważmy następujący fragment z mojej konfiguracji routingu angularUI. Nawiguję do trasy/kategorii/zarządzania/4/szczegółów (na przykład). Oczekuję, że "kategoria" zostanie rozwiązana przed załadowaniem odpowiedniego kontrolera, a nawet w takim stopniu, w jakim mogę umieścić punkt przerwania w funkcji rozstrzygania, która zwraca kategorię z usługi kategorii i zobaczyć, że kategoria została zwrócona. Teraz umieszczając kolejny punkt kontrolny wewnątrz kontrolera, widzę, że "kategoria" jest zawsze niezdefiniowana. Nie jest wstrzykiwany przez router UI.Router kątowy UI nie rozróżnia wprowadzonych parametrów

Czy ktoś może zobaczyć problem? Może znajdować się w innym miejscu niż podany przeze mnie kod, ale ponieważ nie mam błędów podczas uruchamiania kodu, nie jest możliwe określenie źródła problemu. Typowe js cichej awarii!

 .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' 
      }) 

Odpowiedz

13

Koncepcja działa. Stworzyłem working plunker here. Zmiany tutaj

zamiast tego

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

Właśnie wróciłem wynik getCategory ...

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

z naiwnej realizacji usług:

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

nawet jeśli to byłaby obietnica ... postanowienie będzie czekać, aż zostanie przetworzone ...

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

Dziękujemy! Całkowita racja. Dziwne jest to, że używałem tej składni w usłudze $ http i to zawsze działało dobrze, i biorąc pod uwagę, że moja usługa kategorii zwraca obietnicę, zakładałem, że będzie działać tak samo. Będę musiał zrozumieć, jaka jest różnica, ale jeszcze raz dziękuję za pomoc. Bardzo doceniane. –

+0

Nie widziałem żadnej dokumentacji tego użycia. iw dokumencie pokazuje, że obiekt rozstrzygnięcia ma klucz, fabryka. a fabryka przyjmuje tylko ciąg lub funkcję ... – Demonbane

+0

W końcu udało mi się rozwiązać mój własny problem z tym rozwiązaniem. Dzięki! –

Powiązane problemy