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

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

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

Ответ 1

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

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

Ответ 2

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

Ответ 3

Это будет окончательное решение. (вдохновленный сообщением @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

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

$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

Ответ 5

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

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

Мы можем перезагрузить состояние только из HTML.

Ответ 6

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

$state.reload();

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

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

Ответ 7

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

Ответ 8

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

Ответ 9

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

$window.location.href = '/';

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

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

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

Ответ 10

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

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

Ответ 11

Для 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;
        }]);

Ответ 12

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

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

Ответ 13

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

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

Это было с Angular 1.4.0

Ответ 14

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

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

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

Ответ 15

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

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

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

Ответ 16

Вы можете использовать ответ @Rohan fooobar.com/questions/25264/...

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

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

Ответ 17

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

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

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

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

Ответ 18

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

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

$ionicConfigProvider.views.maxCache(0);