2013-10-07 8 views
8

Mam 2 trasy, które współdzielą kontroler, jeden potrzebuje danych rozwiązanych przed załadowaniem widoku, a drugi nie potrzebuje rozwiązanych danych.W jaki sposób można ręcznie wstawiać dane trasowania trasy do kontrolera?

Routing przykład segmentu:

... 
when('/users', { 
    controller: 'UsersCtrl', 
    templateUrl: '/partials/users/view.html', 
    resolve: { 
     resolvedData : ['Accounts', function(Accounts) { 
      return Accounts.get(); 
     }] 
    } 
}). 
when('/users/add', { 
    controller: 'UsersCtrl', 
    templateUrl: '/partials/users/add.html' 
}) 
... 

Controller przykład:

app.controller('UsersCtrl', ['$scope', 'Helper', 'resolvedData', 
    function($scope, Helper, resolvedData) { 
     // this works for the first route, but fails for the second route with 
     // unknown "resolvedDataProvider" 
     console.log(resolvedData); 
}]); 

Czy jest jakiś sposób mogę uzyskać resolvedData w sterowniku bez jawnie przy użyciu name resolve jako zależność? Czy można więc sprawdzić?

Używanie wtryskiwacza $ nie działa. Chciałbym zrobić coś podobnego do:

if ($injector.has('resolveData')) { 
    var resolveData = $injector.get('resolveData'); 
} 

Jednak to nie działa nawet na trasie, która ma resolveData set ('/ Users'):

app.controller('UsersCtrl', ['$scope', 'Helper', '$injector', 
    function($scope, Helper, $injector) { 
     // this does not work -> fails with the unknown "resolvedDataProvider" as well 
     $injector.get('resolvedData'); 
}]); 

można to zrobić w angularjs ? Czy powinienem po prostu stworzyć nowy kontroler?

Dziękuję.

Odpowiedz

7

Wygląda na to, że zorientowali się w inny sposób iść. Rozwiązane dane są częścią $route. Możesz uzyskać do niego dostęp za pomocą:

app.controller('UsersCtrl', ['$scope', '$route', 'Helper', 
    function($scope, $route, Helper) { 

     if ($route.current.locals.resolvedData) { 
      var resolvedData = $route.current.locals.resolvedData; 
     } 
}]); 
+0

W jaki sposób to rozwiązanie jest lepsze niż moje? Zasadniczo robisz dokładnie to samo, z wyjątkiem używania zakopanego obiektu w usłudze routingu, aby go ukończyć. Moje rozwiązanie pozwala na jednorodność routera, a kontroler nadal obsługuje sytuację. – Fourth

+3

@Fourth - Nie sądzę, aby dodanie niewykorzystanego rozstrzygnięcia, które powróciło niezdefiniowane na trasie, byłoby lepszym wyjściem, powiedzmy, że moje rozwiązanie lepiej odpowiada moim potrzebom ... Przekazałem odpowiedź, ale nie wierzę w to, że moja jest uzasadniona. –

+1

Nie korzystasz z funkcji kątowych w zamierzony sposób. Chociaż na pewno znalazłeś odpowiedź "działa", nie używa ona funkcji w zamierzony sposób. Rozgrywki trasy są sposobem na wstrzykiwanie komponentów do kontrolera. Składniki te mogą, z uzasadnionych przyczyn, być niezdefiniowane, jeśli rozstrzygnięcie nie ma sensu dla tej trasy. Zgadzam się z tobą, aby zniechęcić innych do korzystania z tego rozwiązania, co jest uzasadnione. – Fourth

5

Jeśli druga trasa nie jest to potrzebne, po prostu wstrzyknąć niezdefiniowany na tej trasie:

Router:

when('/users', { 
    controller: 'UsersCtrl', 
    templateUrl: '/partials/users/view.html', 
    resolve: { 
     resolvedData : ['Accounts', function(Accounts) { 
      return Accounts.get(); 
     }] 
    } 
}). 
when('/users/add', { 
    controller: 'UsersCtrl', 
    templateUrl: '/partials/users/add.html', 
    resolve: { 
     resolvedData: function() { 
      return undefined; 
     } 
    } 
}) 

kontroler:

app.controller('UsersCtrl', ['$scope', 'Helper', 'resolvedData', 
    function($scope, Helper, resolvedData) { 
     if(resolvedData){ 
      //set some scope stuff for it 
     } else { 
     //do what you do when there is no resolvedData 
     } 
}]); 
Powiązane problemy