2014-07-22 14 views
32

Chciałbym zwrócić .state('name'), gdy zmienię lokalizację w kanciastą.

z mojego run() może zwrócić przedmiot $state:

.run(function($rootScope, Analytics, $location, $stateParams, $state) { 
     console.log($state); 

working object

ale gdy próbuję dostać $state.current jest pusty obiekt

.run(function($rootScope, $location, $stateParams, $state) { 

     console.log($state.current); 

empty

przykład config:

.config(function($stateProvider, $urlRouterProvider, AnalyticsProvider) { 
     $urlRouterProvider.otherwise('/'); 
     $stateProvider 
     .state('home', { 
      url: '/', 
      views: { 
       '': { 
       templateUrl: 'views/main.html', 
       controller: 'MainCtrl' 
       }, 
       '[email protected]': { 
       templateUrl: 'views/partials/navigation.html', 
       controller: 'NavigationCtrl' 
       }, 
       '[email protected]': { 
       templateUrl: 'views/partials/weekly.html', 
       controller: 'WeeklyCtrl' 
       }, 
       '[email protected]': { 
       templateUrl: 'views/partials/side-panel.html', 
       controller: 'SidePanelCtrl' 
       }, 
       '[email protected]': { 
       templateUrl: 'views/partials/shop-panel.html', 
       controller: 'ShopPanelCtrl' 
       }, 
       '[email protected]': { 
       templateUrl: 'views/partials/footer.html', 
       controller: 'FooterCtrl' 
       } 
      } 
      }) 

Odpowiedz

26

Można słuchać '$ stateChangeSuccess' i ustawić stan accrodingly. Na przykład -

$rootScope.$on('$stateChangeSuccess', 
    function(event, toState, toParams, fromState, fromParams) { 
    $state.current = toState; 
    } 
) 
+12

Czy możesz podać wyjaśnienie, dlaczego kod w pytaniu nie działa? – dmr07

+1

Został przestarzały; musisz użyć IHookRegistry teraz @ danm07 http://angular-ui.github.io/ui-router/feature-1.0/interfaces/transition.ihookregistry.html#onstart –

+0

Ten fragment pokaże nazwę każdego stanu, kiedy ładuje na stronie ... $ rootScope. $ on (alert '$ stateChangeSuccess', function() { ($ state.current.name); } ); –

10

Jako alternatywa dla rozwiązania Sandeep, można również zrobić to w ten sposób:

angular.module('yourApp').run(['$rootScope', '$state', 
    function ($rootScope, $state) { 
     $rootScope.$state = $state; 
    } 
]); 

robi to w ten sposób, że jedynie pobiera ustawiony raz zamiast na każdy stateChange. Zasadniczo po prostu przechowujesz odniesienie do stanu $ gdzieś - wybrałem $ rootScope, aby ten przykład był prosty.

Teraz w moim kodu można łatwo odwołać to lubią:

<div ng-show="$state.includes('accounting.dashboard')"></div> 

i

<div>Current State: {{$state.current.name}}</div> 

ja też ogólnie przechowywać $ stateParams jak dobrze, więc mam jeszcze więcej informacji o stanie (ale zostawiłem to z tego przykładu).

+0

Co masz na myśli mówiąc: ustawia się tylko raz zamiast na każdej zmianie stanu? – jeroen

+5

Ponieważ 'run()' jest wywoływane tylko raz przez strukturę po załadowaniu wszystkich modułów kątowych. Co sprawia, że ​​jest to idealne miejsce do ustawiania rzeczy takich jak obiekt skrótu '$ rootScope. $ State = $ state;' raz na zawsze. Z drugiej strony '$ rootScope. $ On ('$ stateChangeSuccess') ...' jest procedurą obsługi zdarzenia wywoływaną za każdym razem, gdy zmienia się stan. – DarkUrse

1

Możesz także spróbować.

.controller('yourApp', function($scope,$state) { 
    $scope.state = $state; 

Teraz możesz zalogować się do konsoli.

console.log($state); 

Należy zwrócić aktualny stan jesteś w.

Albo można nazwać zakres w html widzenia tak.

{{state.current.name}} 

Zwróci również stan, w którym się znajdujesz.

1

Jeśli chcesz się pocieszyć swój stan w sterowniku to należy pocieszyć tak:

console.log($state.current.name); 

A jeśli chcesz się pocieszyć go w widokach następnie:

W sterowniku:

$scope.state = $state.current.name; 

W szablonie: drukuj w ten sposób:

{{state}}