Ответ 1
Это решение работает в AngularJS V.1.2.2:
$state.transitionTo($state.current, $stateParams, {
reload: true,
inherit: false,
notify: true
});
Я использую 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
});
Я нашел, что это самый короткий способ обновления с помощью 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
Это будет окончательное решение. (вдохновленный сообщением @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
Вероятно, более чистый подход будет следующим:
<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")
});
Для 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;
}]);
Все пошло для меня. Единственное, что сработало... добавляет cache-view = "false" в представление, которое я хочу перезагрузить при переходе на него.
из этой проблемы https://github.com/angular-ui/ui-router/issues/582
Не знаю, почему никто из них не работал у меня; тот, который в итоге сделал это:
$state.reload($state.current.name);
Это было с Angular 1.4.0
У меня было несколько вложенных представлений, и целью было перезагрузить только один контент. Я пробовал разные подходы, но единственное, что сработало для меня, это:
//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
});
В этом случае только необходимое представление будет перезагружено, и кэширование все равно будет работать.
Я знаю, что была куча ответов, но лучший способ, который я нашел для этого, не вызывая полного обновления страницы, - создать фиктивный параметр на маршруте, который я хочу обновить, а затем, когда я вызываю маршрут я передайте случайное число в фиктивный параметр.
.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 });
Работает как шарм и обрабатывает разрешения.
Вы можете использовать ответ @Rohan fooobar.com/questions/25264/...
Но если вы хотите сделать каждую загрузку контроллера после изменения вида, вы можете использовать
myApp.config(function($ionicConfigProvider) { $ionicConfigProvider.views.maxCache(0); ... }
У меня была эта проблема, это разрушало мою голову, моя маршрутизация считывается из файла JSON, а затем подается в директиву. Я мог нажать на ui-state, но я не смог перезагрузить страницу. Итак, мой коллега показал мне хороший небольшой трюк.
Это сработало для меня.
Надеюсь, что это поможет
Если вы используете ионный v1, вышеупомянутое решение не будет работать, так как ионный активировал кэширование шаблонов как часть $ionicConfigProvider.
Работайте, потому что это немного хаки - вам нужно установить кеш в 0 в файле ionic.angular.js:
$ionicConfigProvider.views.maxCache(0);