Я использую Angular UI Router и хочу перезагрузить текущее состояние и обновить все данные/перезапустить контроллеры для текущего состояния и родительского.
У меня есть 3 уровня состояния: directory.organisations.details
directory.organisations содержит таблицу со списком организаций. При нажатии на элемент в таблице загружается directory.organisations.details с $StateParams, передающим идентификатор элемента. Поэтому в состоянии подробности загружаются детали этого элемента, редактируются и сохраняются данные. Все в порядке до сих пор.
Теперь мне нужно перезагрузить это состояние и обновить все данные.
Я пробовал:
$state.transitionTo('directory.organisations');
Что касается родительского состояния, но не перезагружает контроллер, я думаю, потому что путь не изменился. В идеале я просто хочу остаться в состоянии directory.organisations.details и обновить все данные в родительском тоже.
Я также пробовал:
$state.reload()
Я видел это в API WIKI для $state.reload "(ошибка с переустановкой контроллеров прямо сейчас, исправление в ближайшее время).
Любая помощь будет оценена?
Это решение работает в AngularJS V.1.2.2:
$state.transitionTo($state.current, $stateParams, {
reload: true,
inherit: false,
notify: true
});
resolve
государства?
Я нашел, что это самый короткий способ обновления с помощью 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
ui-router
. Сделайте window.location.reload(true)
.
$window.location.reload();
, Хотя это кажется немного излишним, это может сделать тестирование / макетирование / знание всех зависимостей частью кода более простым делом.
Это будет окончательное решение. (вдохновленный сообщением @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();
для ионного каркаса
$state.transitionTo($state.current, $state.$current.params, { reload: true, inherit: true, notify: true });//reload
$stateProvider.
state('home', {
url: '/',
cache: false, //required
$state.transitionTo
?
$state.go
не удалось перенаправить в новое состояние. Спасибо @RouR. Спас мой день.
Вероятно, более чистый подход будет следующим:
<a data-ui-sref="directory.organisations.details" data-ui-sref-opts="{reload: true}">Details State</a>
Мы можем перезагрузить состояние только из HTML.
@Ответ Holland Risley теперь доступен как api в последнем ui-маршрутизаторе.
$state.reload();
Метод, который принудительно перезагружает текущее состояние. Все решения повторно реконструированы, контроллеры переустановлены, а события перезапущены.
http://angular-ui.github.io/ui-router/site/#/api/ui.router.state.$state
$state.go($state.current, $stateParams, {reload: true, inherit: false});
$scope.reloadstat = function () { $state.go($state.current, {}, {reload: true}); };
если вы хотите перезагрузить всю страницу, как кажется, просто введите $window в свой контроллер, а затем вызовите
$window.location.href = '/';
но если вы хотите только перезагрузить текущее представление, добавьте $scope, $state и $stateParams (последний на всякий случай, если вам нужно изменить некоторые параметры в этой предстоящей перезагрузке, что-то вроде номера вашей страницы), затем вызовите это в рамках любого метода контроллера:
$stateParams.page = 1;
$state.reload();
AngularJS v1.3.15 angular -ui-router v0.2.15
Глубокое обходное решение, которое всегда срабатывает.
$state.go("otherState").then(function(){
$state.go("wantedState")
});
Не знаю, почему никто из них не работал у меня; тот, который в итоге сделал это:
$state.reload($state.current.name);
Это было с Angular 1.4.0
Все пошло для меня. Единственное, что сработало... добавляет cache-view = "false" в представление, которое я хочу перезагрузить при переходе на него.
из этой проблемы https://github.com/angular-ui/ui-router/issues/582
Для angular v1.2.26 ничего из этого не работает. Для того, чтобы перезагрузить состояние, щелкните ng-click, который вызывает указанные выше методы, нужно нажать дважды.
Итак, я закончил эмуляцию 2 кликов, используя $timeout.
$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;
}]);
Вы можете использовать ответ @Rohan https://stackoverflow.com/questions/21714655/reloading-current-state-refresh-data
Но если вы хотите сделать каждую загрузку контроллера после изменения вида, вы можете использовать
myApp.config(function($ionicConfigProvider) { $ionicConfigProvider.views.maxCache(0); ... }
Я знаю, что была куча ответов, но лучший способ, который я нашел для этого, не вызывая полного обновления страницы, - создать фиктивный параметр на маршруте, который я хочу обновить, а затем, когда я вызываю маршрут я передайте случайное число в фиктивный параметр.
.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 });
Работает как шарм и обрабатывает разрешения.
У меня было несколько вложенных представлений, и целью было перезагрузить только один контент. Я пробовал разные подходы, но единственное, что сработало для меня, это:
//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
});
В этом случае только необходимое представление будет перезагружено, и кэширование все равно будет работать.
Если вы используете ионный v1, вышеупомянутое решение не будет работать, так как ионный активировал кэширование шаблонов как часть $ionicConfigProvider.
Работайте, потому что это немного хаки - вам нужно установить кеш в 0 в файле ionic.angular.js:
$ionicConfigProvider.views.maxCache(0);
У меня была эта проблема, это разрушало мою голову, моя маршрутизация считывается из файла JSON, а затем подается в директиву. Я мог нажать на ui-state, но я не смог перезагрузить страницу. Итак, мой коллега показал мне хороший небольшой трюк.
Это сработало для меня.
Надеюсь, что это поможет