我正在使用Angular UI路由器,想要重新加载当前状态并刷新所有数据/重新运行当前状态及其父状态的控制器。
我有3个状态级别:目录。组织。细节
organizations包含一个包含组织列表的表。单击表中的项目加载directory. organizations .details,并使用$StateParams传递该项的ID。所以在细节状态下,我加载这个项目的细节,编辑它们,然后保存数据。到目前为止一切正常。
现在我需要重新加载这个状态并刷新所有数据。
我试过:
$state.transitionTo('directory.organisations');
它会回到父状态但不会重载控制器,我猜是因为路径没有改变。理想情况下,我只想留在directory. organizations .details状态,并刷新父目录中的所有数据。
我也试过:
$state.reload()
我在$state的API WIKI上看到过这个。重新加载”(错误与控制器重新验证现在,修复很快)。
如果有任何帮助,我将不胜感激。
我知道有一堆答案,但我发现最好的方法,这样做,而不引起整个页面刷新是在路由上创建一个虚拟参数,我想要刷新,然后当我调用路由时,我传递一个随机数到虚拟参数。
.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 });
很有魅力,能解决问题。
这就是最终的解决方案。(灵感来自@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();