Exposing the current state name with ui router

前端 未结 6 1522
清歌不尽
清歌不尽 2020-12-14 05:28

I\'m trying to implement a language switcher where if a user clicks on \"de\" from any given page on an \"en\" side - it takes them to that page of the \"de\" side. If I con

相关标签:
6条回答
  • 2020-12-14 06:04

    I wrapped around $state around $timeout and it worked for me.

    For example,

    (function() {
      'use strict';
    
      angular
        .module('app')
        .controller('BodyController', BodyController);
    
      BodyController.$inject = ['$state', '$timeout'];
    
      /* @ngInject */
      function BodyController($state, $timeout) {
        $timeout(function(){
          console.log($state.current);
        });
    
      }
    })();
    
    0 讨论(0)
  • 2020-12-14 06:05

    In my current project the solution looks like this:

    I created an abstract Language State

    $stateProvider.state('language', {
        abstract: true,
        url: '/:language',
        template: '<div ui-view class="lang-{{language}}"></div>'
    });
    

    Every state in the project has to depend on this state

    $stateProvider.state('language.dashboard', {
        url: '/dashboard'
        //....
    });
    

    The language switch buttons calls a custom function:

    <a ng-click="footer.setLanguage('de')">de</a>
    

    And the corresponding function looks like this (inside a controller of course):

    this.setLanguage = function(lang) {
        FooterLog.log('switch to language', lang);
        $state.go($state.current, { language: lang }, {
            location: true,
            reload: true,
            inherit: true
        }).then(function() {
            FooterLog.log('transition successfull');
        });
    };
    

    This works, but there is a nicer solution just changing a value in the state params from html:

    <a ui-sref="{ language: 'de' }">de</a>
    

    Unfortunately this does not work, see https://github.com/angular-ui/ui-router/issues/1031

    0 讨论(0)
  • 2020-12-14 06:07

    this is how I do it

    JAVASCRIPT:

    var module = angular.module('yourModuleName', ['ui.router']);
    
    module.run( ['$rootScope', '$state', '$stateParams',
                          function ($rootScope,   $state,   $stateParams) {
        $rootScope.$state = $state;
        $rootScope.$stateParams = $stateParams; 
    }
    ]);
    

    HTML:

    <pre id="uiRouterInfo">
          $state = {{$state.current.name}}
          $stateParams = {{$stateParams}}
          $state full url = {{ $state.$current.url.source }}    
    </pre>
    

    EXAMPLE

    http://plnkr.co/edit/LGMZnj?p=preview

    0 讨论(0)
  • 2020-12-14 06:07

    Its just because of the load time angular takes to give you the current state.

    If you try to get the current state by using $timeout function then it will give you correct result in $state.current.name

    $timeout(function(){
        $rootScope.currState = $state.current.name;
    })
    
    0 讨论(0)
  • 2020-12-14 06:12

    Answering your question in this format is quite challenging.

    On the other hand you ask about navigation and then about current $state acting all weird.

    For the first I'd say it's too broad question and for the second I'd say... well, you are doing something wrong or missing the obvious :)

     

    Take the following controller:

    app.controller('MainCtrl', function($scope, $state) {
      $scope.state = $state;
    });
    

    Where app is configured as:

    app.config(function($stateProvider) {
      $stateProvider
        .state('main', {
            url: '/main',
            templateUrl: 'main.html',
            controller: 'MainCtrl'
        })
        .state('main.thiscontent', {
            url: '/thiscontent',
            templateUrl: 'this.html',
            controller: 'ThisCtrl'
        })
        .state('main.thatcontent', {
            url: '/thatcontent',
            templateUrl: 'that.html'
        });
    });
    

    Then simple HTML template having

    <div>
      {{ state | json }}
    </div>
    

    Would "print out" e.g. the following

    { 
      "params": {}, 
      "current": { 
        "url": "/thatcontent", 
        "templateUrl": "that.html", 
        "name": "main.thatcontent" 
      }, 
      "transition": null
    }
    

    I put up a small example showing this, using ui.router and pascalprecht.translate for the menus. I hope you find it useful and figure out what is it you are doing wrong.

    Plunker here http://plnkr.co/edit/XIW4ZE

     

    Screencap


    imgur

    0 讨论(0)
  • 2020-12-14 06:21

    Use Timeout

    $timeout(function () { console.log($state.current, 'this is working fine'); }, 100);
    

    See - https://github.com/angular-ui/ui-router/issues/1627

    0 讨论(0)
提交回复
热议问题