重新加载当前状态 - 刷新数据

时间:2014-02-11 22:38:26

标签: angularjs angular-ui angular-ui-router

我正在使用Angular UI路由器,并希望重新加载当前状态并刷新所有数据/重新运行控制器以获取当前状态及其父级。

我有3个州级别: directory.organisations.details

directory.organisations 包含一个包含组织列表的表。单击表中的项目会加载 directory.organisations.details ,并使用$ StateParams传递项目的ID。因此,在详细信息状态下,我加载此项目的详细信息,编辑它们,然后保存数据。到目前为止都很好。

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

我试过了:

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

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

我也尝试过:

$state.reload()

我已经在API WIKI for $ state.reload上看到过这个问题(控制器现在重新修复的错误,很快就会修复)。“

任何帮助都会受到赞赏吗?

18 个答案:

答案 0 :(得分:542)

我发现这是用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

答案 1 :(得分:148)

此解决方案适用于AngularJS V.1.2.2:

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

答案 2 :(得分:67)

这将是最终的解决方案。 (灵感来自@ 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();

答案 3 :(得分:56)

for ionic framework

$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

答案 4 :(得分:44)

可能更清洁的方法如下:

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

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

答案 5 :(得分:19)

@Holland Risley的答案现在可以在最新的ui-router中作为api使用。

$state.reload();
  

强制重新加载当前状态的方法。所有结果都是   重新解决,重新安置控制器,重新启动事件。

http://angular-ui.github.io/ui-router/site/#/api/ui.router.state.$state

答案 6 :(得分:15)

$

答案 7 :(得分:9)

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

答案 8 :(得分:6)

如果您想重新加载整个页面,就像看起来一样,只需在控制器中注入$ window然后调用

$window.location.href = '/';

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

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

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

答案 9 :(得分:4)

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

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

答案 10 :(得分:2)

一切都失败了。唯一有效的方法是将cache-view =“false”添加到我想要重新加载的视图中。

来自此问题https://github.com/angular-ui/ui-router/issues/582

答案 11 :(得分:2)

对于角度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;
        }]);

答案 12 :(得分:2)

不确定为什么这些似乎都不适合我;最终做到的是:

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

这是使用Angular 1.4.0

答案 13 :(得分:1)

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

//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
  });

在这种情况下,只需要重新加载所需的视图,缓存仍然有效。

答案 14 :(得分:1)

我知道有很多答案,但我发现这样做的最好方法却没有导致整页刷新,就是在我要刷新的路线上创建一个虚拟参数然后当我调用路线时将随机数传递给虚拟参数。

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

像魅力一样工作并处理结果。

答案 15 :(得分:1)

您可以使用@Rohan answer https://stackoverflow.com/a/23609343/3297761

但是如果你想在视图改变后使每个控制器成为可能,你可以使用

myApp.config(function($ionicConfigProvider) { $ionicConfigProvider.views.maxCache(0); ... }

答案 16 :(得分:1)

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

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

$ionicConfigProvider.views.maxCache(0);

答案 17 :(得分:0)

我有这个问题它破坏了我的头,我的路由从JSON文件中读取然后被送入指令。我可以点击一个ui状态,但我无法重新加载页面。所以我的同事给我看了一个不错的小技巧。

  1. 获取您的数据
  2. 在您的应用配置中创建加载状态
  3. 在根目镜中保存您要进入的状态。
  4. 在app.run
  5. 中将您的位置设置为“/ loading”
  6. 在加载控制器中解析路由承诺,然后将位置设置为预期目标。
  7. 这对我有用。

    希望有所帮助