2014-07-22 5 views
32

Ich möchte die .state('name') zurückgeben, wenn ich den Standort in eckig ändere.

Aus meiner run() kann es geben die $state Objekt:

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

working object

aber wenn ich versuche $state.current zu bekommen, ist es leer Objekt

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

     console.log($state.current); 

empty

Konfigurationsbeispiel:

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

Antwort

26

Sie können für '$ stateChangeSuccess' hören und accrodinglyafter Zustand gesetzt. Zum Beispiel -

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

Können Sie bitte erläutern, warum der Code in der Frage nicht funktioniert hat? – dmr07

+1

Es wurde veraltet; Sie müssen die IHookRegistry jetzt @ danm07 http://angular-ui.github.io/ui-router/feature-1.0/interfaces/transition.ihookregistry.html#onstart verwenden. –

+0

Dieses Snippet zeigt den Namen jedes Staates, wenn es lädt auf der Seite ... $ rootScope. $ on ('$ stateChangeSuccess', Funktion() { Warnung ($ state.current.name); } ); –

10

Als Alternative zu Sandeep-Lösung, können Sie es auch so:

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

es auf diese Weise tun, es wird nur einmal festgelegt, anstatt auf jeder stateChange. Im Grunde speichern Sie nur einen Verweis auf $ state irgendwo - ich wählte $ rootScope, nur um dieses Beispiel einfach zu halten.

Jetzt in meinem Code kann ich es einfach gerne verweisen:

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

und

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

Ich speichere auch allgemein stateParams $ als auch, damit ich noch mehr Informationen über den Zustand haben (aber ich habe es aus diesem Beispiel weggelassen).

+0

Was meinst du mit: es wird nur einmal statt auf jedem stateChange gesetzt? – jeroen

+5

Weil 'run()' nur einmal vom Framework aufgerufen wird, nachdem alle angularen Module geladen wurden. Das macht es zum perfekten Ort, um Dinge wie das Shortcut-Objekt '$ rootScope. $ State = $ state;' ein für allemal einzurichten. Auf der anderen Seite wird $ rootScope. $ On ('$ stateChangeSuccess') ... 'ein Event-Handler, der jedes Mal aufgerufen wird, wenn der Status geändert wird. – DarkUrse

1

Sie können es auch versuchen.

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

Jetzt können Sie es in Ihrer Konsole anmelden.

console.log($state); 

Es sollte den aktuellen Zustand zurückkehren Sie sind in.

Oder Sie können wie folgt den Umfang in Ihre HTML-Ansicht aufrufen.

{{state.current.name}} 

Es gibt auch de Zustand zurück, in dem Sie sich befinden.

1

Wenn Sie Ihren Zustand in der Steuerung trösten wollen, dann sollten Sie so trösten:

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

Und wenn Sie wollen, dass es in Aussicht trösten dann:

In Controller:

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

In Vorlage: drucken wie die

{{state}} 
Verwandte Themen