2014-07-22 7 views
32

Desidero restituire il .state('name') quando cambio posizione in angolare.

Dal mio run() può restituire l'oggetto $state:

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

working object

ma quando provo ad ottenere $state.current è oggetto vuoto

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

     console.log($state.current); 

empty

config esempio:

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

risposta

26

È possibile ascoltare per '$ stateChangeSuccess' e impostare lo stato accrodingly. Per esempio -

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

Puoi fornire una spiegazione del motivo per cui il codice nella domanda non ha funzionato? – dmr07

+1

È stato deprecato; devi usare IHookRegistry ora @ danm07 http://angular-ui.github.io/ui-router/feature-1.0/interfaces/transition.ihookregistry.html#onstart –

+0

Questo snippet mostrerà il nome di ogni stato quando carichi sulla pagina ... $ rootScope. $ on ('$ stateChangeSuccess', function() { alert ($ state.current.name); } ); –

10

In alternativa alla soluzione di Sandeep, è anche possibile fare in questo modo:

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

Facendo in questo modo, solo viene impostata una volta invece che su ogni stateChange. Fondamentalmente è sufficiente memorizzare un riferimento a $ stato da qualche parte - Ho scelto $ rootScope solo per mantenere semplice questo esempio.

Ora nel mio codice posso facilmente riferimento ad esso come:

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

e

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

ho anche generalmente memorizzare $ stateParams pure in modo non ho ancora più informazioni sullo stato (ma io lasciato fuori da questo esempio).

+0

Con cosa intendi: si imposta solo una volta anziché su ogni statoCambia? – jeroen

+5

Perché 'run()' viene chiamato una sola volta dal framework dopo che tutti i moduli angolari sono stati caricati. Il che rende la posizione perfetta per configurare cose come l'oggetto di collegamento '$ rootScope. $ State = $ state;' una volta per tutte. D'altra parte '$ rootScope. $ On ('$ stateChangeSuccess') ...' è un gestore di eventi chiamato ogni volta che lo stato viene modificato. – DarkUrse

1

Puoi anche provare.

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

Ora è possibile accedere alla console.

console.log($state); 

Esso dovrebbe restituire lo stato attuale ci si trova.

oppure è possibile chiamare l'ambito della tua visualizzazione HTML come questo.

{{state.current.name}} 

Restituirà anche lo stato in cui ci si trova.

1

Se si vuole consolare il tuo stato nel regolatore allora si dovrebbe consolarsi così:

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

E se si vuole consolare in vista poi:

In regolatore:

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

In Template: stampa come quella

{{state}}