$route.reload() does not work with ui-router

2020-02-23 03:56发布

I've switched to to ui-router. Everything went smoothly, except one thing. On my page I have a select that changes the context of the application. Anyway, previously, when this context was changed I was executing this code (in particular, set method):

'use strict';
angular.module('main').factory('lacContext', ['$route', function ($route) {
    return {
        set: function (id) {
            sessionStorage.setItem("lac-context", id);
            $route.reload();
        },
        get: function () {
            return sessionStorage.getItem("lac-context");
        }
    };
}])

and

$route.reload()

was doing the most important thing. It reloaded the page. But after switching to ui-router, $route.reload does nothing. Also I did not find counterpart in ui-router API. How to solve this issue?

5条回答
疯言疯语
2楼-- · 2020-02-23 04:14

The only thing worked for me:

Create redirect state:

$stateProvider.state('redirect', {
    url: 'redirect/:to',
    controller: function($state, $stateParams, $scope) {
        $state.go($stateParams.to, null, {reload: true});
    }
});

Go to this state:

$state.go('redirect', {to: $state.current.name}, {reload: true});
查看更多
Deceive 欺骗
3楼-- · 2020-02-23 04:23

Ok it works when I inject $state into controller.

But when injecting it into service like code snippet, of course $state was undefined.

Although

$state.go('.')

did not work, I did something like this:

    $stateProvider
      .state('home', {
          controller: function ($state) {
              $state.go('advisoryLeadOffering.packages');
          }
      })
      .state('advisoryLeadOffering.packages', {
          url: "/packages",
          templateUrl: "/AdvisoryLeadOffering/Packages",
          controller: 'AdvisoryLeadOfferingPackages'
      })

and when I need to reload I do something like this:

$state.transitionTo('home');

inside scope's method.

查看更多
ゆ 、 Hurt°
4楼-- · 2020-02-23 04:25

You can do $state.reload()

There's a bug with it sometimes not re-instantiating the controller. You can get around that with

$state.transitionTo($state.current, $stateParams, { reload: true, inherit: true, notify: true });
查看更多
Emotional °昔
5楼-- · 2020-02-23 04:29

I had a similar problem where I wanted a link outside of the controller to refresh a state and just created a reload() function in the controller.

SomeCtrl:

$scope.reload = function(){
    $state.transitionTo('myState');
}

Add this to your anchor:

ng-click="reload()"

H/T @dragonfly for pointing me to transitionTo().

查看更多
孤傲高冷的网名
6楼-- · 2020-02-23 04:32

How about:

$state.go($state.$current, null, { reload: true });
查看更多
登录 后发表回答