如何重新加载当前状态?


333

我正在使用Angular UI Router,想重新加载当前状态并刷新所有数据/为当前状态及其父级重新运行控制器。

我有3个状态级别:directory.organisations.details

directory.organisations包含一个带有组织列表的表。单击表中的一个项目将加载$ directoryParams传递该项目的ID的directory.organisations.details详细信息。因此,在详细信息状态下,我将加载该项目的详细信息,对其进行编辑,然后保存数据。到目前为止一切都很好。

现在,我需要重新加载此状态并刷新所有数据。

我努力了:

 $state.transitionTo('directory.organisations');

我猜这是因为它的父级状态,但不会重新加载控制器,因为路径没有改变。理想情况下,我只想保留在directory.organisations.details状态并刷新父级中的所有数据。

我也尝试过:

$state.reload()

我已经在API WIKI上以$ state.reload看到了这一点(“(现在正在重新实例化控制器的错误,即将修复)。”

任何帮助,将不胜感激?


7
我已经解决了这个问题,如下所示:
Holland Risley 2014年

1
在哪里添加此代码?
Manoj G

那么该错误现在已修复吗? github.com/angular-ui/ui-router/wiki/...
jchnxu

代码$state.transitionTo($state.current, $stateParams, {reload:true, inherit:false})应添加到哪里?在我的状态重新加载中遇到同样的问题会丢失所有数据。
埃文·伯比奇

Answers:


565

我发现这是使用ui-router刷新的最短工作方式:

$state.go($state.current, {}, {reload: true}); //second parameter is for $stateParams

较新版本的更新

$state.reload();

别名是:

$state.transitionTo($state.current, $stateParams, { 
  reload: true, inherit: false, notify: true
});

文档:https : //angular-ui.github.io/ui-router/site/#/api/ui.router.state.$state#methods_reload


21
可能值得注意的是,这些都没有真正重新加载页面。如果您想重新加载状态和页面,ui-router我认为没有方法。做window.location.reload(true)
SimplGy 2014年

15
@SimpleAsCouldBe如果您想对此更加了解,可以这样做$window.location.reload();。尽管这似乎有些过大,但它可以使测试/模拟/了解所有依赖关系的代码片段变得更容易些。
edhedges,2014年

1
只是好奇,“ $ state.current”到底是什么意思?我在ui-router的API上看不到清晰的解释,我们将不胜感激,谢谢!
user2499325

3
@ user2499325:$ state.current返回一个对象,该对象包含您在stateProvider中拥有的所有数据:```{url:“ / place /:placeId”,控制器:“ NewPlaceController”,controllerAs:“ placeVM”,templateUrl:“ places /new.place/new.place.details.html“,名称:” index.places.placeDetails“}```
Xavier Haniquaut 2015年

1
如果已经加载了这样的参数,则可以用$ stateParams替换{}:$ state.go($ state.current,$ stateParams,{reload:true});
tsuz

154

此解决方案在AngularJS V.1.2.2中有效:

$state.transitionTo($state.current, $stateParams, {
    reload: true,
    inherit: false,
    notify: true
});

8
您将在哪里添加它,以免引起无限循环?
Pathsofdesign

5
这会重新解决国家的resolve项目吗?
TheSharpieOne 2014年

7
另外,如果将调用更改为$ state.params,则不必注入$ stateParams
Jeff Ancel

4
比目前投票最高的答案要好得多,实际上是重新加载了页面。如果您遇到无限循环问题,则可能是重新加载的位置错误。我仅在单击按钮时使用它
Dan

2
@ManojG有点晚,但是您可以将此代码放置在需要强制重新加载的任何位置-可能是在ng-click指令函数或其他事件中。出于明显的原因(无限循环),不应在每次页面加载时都执行此操作
sricks 2015年

68

那将是最终的解决方案。(灵感来自@Hollan_Risley的帖子)

'use strict';

angular.module('app')

.config(function($provide) {
    $provide.decorator('$state', function($delegate, $stateParams) {
        $delegate.forceReload = function() {
            return $delegate.go($delegate.current, $stateParams, {
                reload: true,
                inherit: false,
                notify: true
            });
        };
        return $delegate;
    });
});

现在,每当需要重新加载时,只需调用:

$state.forceReload();

6
inifinit死亡循环
CS

6
听起来您的某个地方有拦截器被触发。我已经对该解决方案进行了多次测试,并且效果很好。
2014年

2
@MK感谢您的来信。它引导我寻求解决自己的不同问题的方法。我花了几个小时试图找出为什么我的请求被增加一倍,然后增加三倍的原因等等,这都是由于拦截器(github.com/witoldsz/angular-http-auth)。
Maciej Gurban 2014年

57

用于离子骨架

$state.transitionTo($state.current, $state.$current.params, { reload: true, inherit: true, notify: true });//reload

$stateProvider.
  state('home', {
    url: '/',
    cache: false, //required

https://github.com/angular-ui/ui-router/issues/582


$state.go无法重定向到新状态的情况下,对我来说效果很好。谢谢@RouR。拯救了我的一天。
Guillaume Wuip

我认为用$ state.transitionTo替换$ state.go。因此,无论您在哪里调用$ state.go,都只需替换一下即可。它可能看起来像$ state.transitionTo('tab-name',{key:value},{reload:true,Inheritance:true,notify:true}
Bill Pope

2
缓存:技巧不对。但是对性能有多大影响?
FrEkKAn16年

用$ state.transitionTo更改$ state.go来更改状态并重新加载@ManojG
Gery

我是否必须包括一些新库才能使用$state?我正在运行离子1.4.0,角度为1.5.3
josinalvo

45

可能更清洁的方法如下:

<a data-ui-sref="directory.organisations.details" data-ui-sref-opts="{reload: true}">Details State</a>

我们只能从HTML重新加载状态。


7
您也可以使用ui-sref-opts =“ {reload:'child.state'}”来避免重新加载整个页面,其中'child.state'是代表您实际状态的字符串。
迈克尔·富尔顿



13
$scope.reloadstat = function () { $state.go($state.current, {}, {reload: true}); };

7

如果您想重新加载整个页面(如看上去),只需将$ window注入到控制器中,然后调用

$window.location.href = '/';

但是,如果您只想重新加载当前视图,请注入$ scope,$ state和$ stateParams(后者,以防万一您需要在即将进行的重新加载中更改某些参数(例如您的页码)),然后在任意控制器方法:

$stateParams.page = 1;
$state.reload();

AngularJS v1.3.15 angular-ui-router v0.2.15


6

始终有效的愚蠢解决方法。

$state.go("otherState").then(function(){
     $state.go("wantedState")
});

3

对于angular v1.2.26,上述所有方法均无效。调用上述方法的ng-click必须被单击两次,以使状态重新加载。

因此,我最终使用$ timeout模拟了2次点击。

$provide.decorator('$state',
        ["$delegate", "$stateParams", '$timeout', function ($delegate, $stateParams, $timeout) {
            $delegate.forceReload = function () {
                var reload = function () {
                    $delegate.transitionTo($delegate.current, angular.copy($stateParams), {
                        reload: true,
                        inherit: true,
                        notify: true
                    })
                };
                reload();
                $timeout(reload, 100);
            };
            return $delegate;
        }]);

Navigation.reload()需要使用Angular 1.3.0-rc0进行两次单击,但是transitionTo()可以正常工作。如果您遇到这个问题,也许可以尝试升级
sricks 2015年


3

不知道为什么这些都不适合我?最终做到这一点的是:

$state.reload($state.current.name);

这是在Angular 1.4.0中


2

我有多个嵌套视图,目标是仅重新加载一个内容。我尝试了不同的方法,但唯一对我有用的是:

//to reload
$stateParams.reload = !$stateParams.reload; //flip value of reload param
$state.go($state.current, $stateParams);

//state config
$stateProvider
  .state('app.dashboard', {
    url: '/',
    templateUrl: 'app/components/dashboard/dashboard.tmpl.html',
    controller: 'DashboardController',
    controllerAs: 'vm',
    params: {reload: false} //add reload param to a view you want to reload
  });

在这种情况下,仅需要的视图将被重新加载并且缓存仍将起作用。


重新加载true或false,u称为false。false将使用最新更改重新加载内容吗?
死路

2

我知道有很多答案,但是我发现做到这一点而不引起整页刷新的最好方法是在要刷新的路由上创建一个虚拟参数,然后在我调用该路由时传递虚拟参数的随机数。

            .state("coverage.check.response", {
                params: { coverageResponse: null, coverageResponseId: 0, updater: 1 },
                views: {
                    "coverageResponse": {
                        templateUrl: "/Scripts/app/coverage/templates/coverageResponse.html",
                        controller: "coverageResponseController",
                        controllerAs: "vm"
                    }
                }
            })

然后拨打该路线

$state.go("coverage.check.response", { coverageResponse: coverage, updater: Math.floor(Math.random() * 100000) + 1 });

像魅力一样运作并处理决心。



2

如果您使用的是ionic v1,则上述解决方案将无法使用,因为ionic已将模板缓存作为$ ionicConfigProvider的一部分启用。

解决这个问题有点麻烦-您必须在ionic.angular.js文件中将缓存设置为0:

$ionicConfigProvider.views.maxCache(0);

1

我遇到了一个问题,它使我很头疼,我的路由从JSON文件中读取,然后输入到指令中。我可以单击ui状态,但是无法重新加载页面。因此,我的一个同事向我展示了一个不错的小技巧。

  1. 获取您的数据
  2. 在您的应用程序配置中创建加载状态
  3. 将您想要进入的状态保存在rootscope中。
  4. 在您的app.run中将您的位置设置为“ /正在加载”
  5. 在加载控制器中,解析路由承诺,然后将位置设置为预期的目标。

这对我有用。

希望能帮助到你

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.