Перезагрузка текущего состояния - обновить данные

277

Я использую 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 "(ошибка с переустановкой контроллеров прямо сейчас, исправление в ближайшее время).

Любая помощь будет оценена?

  • 7
    Я решил это следующим образом: $ state.transitionTo ($ state.current, $ stateParams, {reload: true, наследовать: false, notify: true});
  • 1
    куда добавить этот код?
Показать ещё 2 комментария
Теги:
angular-ui-router
angular-ui

18 ответов

149
Лучший ответ

Это решение работает в AngularJS V.1.2.2:

$state.transitionTo($state.current, $stateParams, {
    reload: true,
    inherit: false,
    notify: true
});
  • 8
    Куда бы вы добавили это, чтобы оно не вызывало бесконечный цикл?
  • 4
    Будет ли это повторно разрешить пункты resolve государства?
Показать ещё 14 комментариев
450

Я нашел, что это самый короткий способ обновления с помощью 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

  • 18
    Вероятно, стоит отметить, что ни один из них на самом деле не перезагружает страницу. Если вы хотите перезагрузить состояние и страницу, я думаю, что для этого нет метода ui-router . Сделайте window.location.reload(true) .
  • 15
    @SimpleAsCouldBe, если вы хотите быть более откровенным, вы можете сделать $window.location.reload(); , Хотя это кажется немного излишним, это может сделать тестирование / макетирование / знание всех зависимостей частью кода более простым делом.
Показать ещё 8 комментариев
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();
  • 4
    начертание петли смерти
  • 6
    Похоже, у вас где-то есть перехватчик, который срабатывает. Я протестировал это решение несколько раз, и оно отлично работает.
Показать ещё 1 комментарий
54

для ионного каркаса

$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

  • 2
    Где добавить код $state.transitionTo ?
  • 0
    Прекрасно работает для меня, когда $state.go не удалось перенаправить в новое состояние. Спасибо @RouR. Спас мой день.
Показать ещё 5 комментариев
42

Вероятно, более чистый подход будет следующим:

<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 - строка, представляющая ваше фактическое состояние.
17

@Ответ Holland Risley теперь доступен как api в последнем ui-маршрутизаторе.

$state.reload();

Метод, который принудительно перезагружает текущее состояние. Все решения повторно реконструированы, контроллеры переустановлены, а события перезапущены.

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

14
$state.go($state.current, $stateParams, {reload: true, inherit: false});
6
$scope.reloadstat = function () { $state.go($state.current, {}, {reload: true}); };
5

если вы хотите перезагрузить всю страницу, как кажется, просто введите $window в свой контроллер, а затем вызовите

$window.location.href = '/';

но если вы хотите только перезагрузить текущее представление, добавьте $scope, $state и $stateParams (последний на всякий случай, если вам нужно изменить некоторые параметры в этой предстоящей перезагрузке, что-то вроде номера вашей страницы), затем вызовите это в рамках любого метода контроллера:

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

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

3

Глубокое обходное решение, которое всегда срабатывает.

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

Не знаю, почему никто из них не работал у меня; тот, который в итоге сделал это:

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

Это было с Angular 1.4.0

2

Все пошло для меня. Единственное, что сработало... добавляет cache-view = "false" в представление, которое я хочу перезагрузить при переходе на него.

из этой проблемы https://github.com/angular-ui/ui-router/issues/582

  • 3
    Вы должны добавить, что это для ионных
2

Для 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;
        }]);
  • 0
    Navigation.reload () требовал два щелчка с Angular 1.3.0-rc0, но transitionTo () работал нормально. Возможно, попробуйте обновить, если у вас есть эта проблема
1

Вы можете использовать ответ @Rohan https://stackoverflow.com/questions/21714655/reloading-current-state-refresh-data

Но если вы хотите сделать каждую загрузку контроллера после изменения вида, вы можете использовать

myApp.config(function($ionicConfigProvider) { $ionicConfigProvider.views.maxCache(0); ... }
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 });

Работает как шарм и обрабатывает разрешения.

  • 0
    Это сработало для меня, спасибо.
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
  });

В этом случае только необходимое представление будет перезагружено, и кэширование все равно будет работать.

0

Если вы используете ионный v1, вышеупомянутое решение не будет работать, так как ионный активировал кэширование шаблонов как часть $ionicConfigProvider.

Работайте, потому что это немного хаки - вам нужно установить кеш в 0 в файле ionic.angular.js:

$ionicConfigProvider.views.maxCache(0);
0

У меня была эта проблема, это разрушало мою голову, моя маршрутизация считывается из файла JSON, а затем подается в директиву. Я мог нажать на ui-state, но я не смог перезагрузить страницу. Итак, мой коллега показал мне хороший небольшой трюк.

  • Получить данные
  • В конфигурациях ваших приложений создайте состояние загрузки
  • Сохраните состояние, в котором вы хотите перейти в корнеплод.
  • Установите ваше местоположение в "/погрузка" в приложении app.run
  • В контроллере загрузки разрешите обещание маршрутизации, а затем установите местоположение в назначенный вами объект.

Это сработало для меня.

Надеюсь, что это поможет

Ещё вопросы

Сообщество Overcoder
Наверх
Меню