1

У нас есть приложение ASP.NET MVC 5, которое использует ui-router AngularJS module.Угловой ui-router показывает старые устаревшие данные после перехода обратно в состояние

Когда мы вернемся в состояние, которое уже было загружено, оно всегда показывает старые данные, пока мы не обновим полную страницу.

Например:

  • пользователь нажимает кнопку «Просмотр профиля», мы показываем состояние «ViewProfile», страница отображения профиля
  • Пользователь нажимает «Редактировать профиль», мы показываем состояние «EditProfile» , страница с полями для редактирования профиля
  • Пользователь вносит изменения и нажимает «Сохранить», затем они возвращаются в состояние «ViewProfile»
  • Когда состояние «ViewProfile» загружается, оно все еще показывает старые данные до редактирование

Как мы можем заставить маршрут ui извлекать свежие данные в любое время, когда он загружает любое состояние?

Угловая конфигурация

var app = angular.module("MyApp", ['ngIdle', 'ui.router']) 
    .config(['$stateProvider', '$urlRouterProvider', '$locationProvider', 
     function ($stateProvider, $urlRouterProvider, $locationProvider) { 
      // Configure client-side routing 
      $locationProvider.hashPrefix("!").html5Mode(true); 
      $urlRouterProvider.otherwise("/"); 

      $stateProvider 
       .state('Home', { 
        url: '/', 
        views: { 
         "mainContainer": { 
          templateUrl: function (params) { return 'Home/Index'; } 
         } 
        } 
       })      
       .state('ProfileManagement', { 
        url: '/ProfileManagement-{action}', 
        views: { 
         "mainContainer": { 
          templateUrl: function (params) { return 'ProfileManagement/' + params.action; } 
         } 
        } 
       }) 
     }]); 

Как мы делаем переход

$state.go(stateName, { action: actionName }, { reload: true, inherit: false, notify: true }); 

EDIT ж/Решение Поскольку все функции записывается с помощью JQuery, мы не можем использовать угловые контроллеры для управления данными. Наше решение состояло в том, чтобы полностью отключить кеширование угловых шаблонов с помощью следующего кода:

app.run(function ($rootScope, $templateCache) { 
     $rootScope.$on('$viewContentLoaded', function() { 
      $templateCache.removeAll(); 
     }); 
    }); 
+0

Старый вопрос, но с той же проблемой. Я добавил ваш код, но на этот раз я потерял всю свою глобальную информацию. Есть идеи? – Murat

ответ

0

Возможно, эта работа для вашей проблемы.

В вашей угловой главной странице вы должны иметь что-то вроде этого:

app.run(['$rootScope', function ($rootScope){ $rootScope.$on('$stateChangeStart', function(event, toState){ $rootScope.UrlActive=toState.name; }); }]);

В вашем угловом контроллере вы должны иметь что-то вроде этого:

app.controller('AnalisisCtrl', ['$scope','$rootScope', function ($scope,$rootScope) { $scope.$watch('UrlActive', function(newValue) { if(newValue="ProfileManagement"){ doSomething(); }; }); }]);

0

По умолчанию Ui-маршрутизатор переход состояния не будет повторно запускать контроллер toState.

Чтобы создать экземпляр контроллера, вы можете это сделать.

//assuming you are using $state.go to go back to previous state 
$state.go('to.state', params, { 
    reload: true 
}); 
+0

Спасибо за ваш ответ. Так мы делаем переход, но, похоже, он не работает. Я редактировал вопрос, чтобы показать, как мы выполняем переход. – thiag0

+0

Не могли бы вы поделиться кодом контроллера состояния ViewProfile? –

+0

В этом состоянии нет специального контроллера. Это приложение использует jQuery для всех функций и использует только Angular только для маршрутизации. В принципе, после успешного сообщения формы мы вызываем функцию JS, которая получает область действия и вызывает метод контроллера области, который вызывает $ state.go. Я знаю, что это не идеальная настройка, но все функциональные возможности уже были установлены до того, как мы применили угловую маршрутизацию. – thiag0

0

Вы должны использовать разрешились, например, так:

var app = angular.module("MyApp", ['ngIdle', 'ui.router']) 
    .config(['$stateProvider', '$urlRouterProvider', '$locationProvider', 
    function ($stateProvider, $urlRouterProvider, $locationProvider) { 
     // Configure client-side routing 
     $locationProvider.hashPrefix("!").html5Mode(true); 
     $urlRouterProvider.otherwise("/"); 

     $stateProvider 
     .state('Home', { 
      url: '/', 
      views: { 
      "mainContainer": { 
       templateUrl: function (params) { return 'Home/Index'; } 
      } 
      }, 
      resolve: { 
      loadedData: (injectable) => injectable.getData() 
      } 
     })      
     .state('ProfileManagement', { 
      url: '/ProfileManagement-{action}', 
      views: { 
      "mainContainer": { 
       templateUrl: function (params) { return 'ProfileManagement/' + params.action; } 
      } 
      }, 
      resolve: { 
      loadedData: (injectable) => injectable.getData() 
      } 
     }) 
    }]); 

В каждом государстве есть решительность, вызывая метод «GetData()» в инъекционной службе (я говорю «сервис», потому что именно там мы будем загружать данные).

Затем для каждого контроллера состояния он будет иметь доступ к разрешению загруженных данных; данные уже будут загружены в этот момент и будут использоваться этим контроллером.Поэтому для вашего сценария, возвращаясь к состоянию, из которого вы пришли, обновленные данные снова будут загружены и снова доступны в этом состоянии.

Сохраняйте переход состояния таким же, с reload: true, так как это то, что вы хотите.

+0

Будет ли это работать, даже если в состоянии нет определенного контроллера? Я попытался добавить это свойство «разрешение» в мое определение состояния, но он не позволяет загружать состояние. – thiag0

+0

Вам, вероятно, понадобится контроллер для каждого состояния да. Таким образом, вы можете извлечь данные из возврата разрешения, чтобы использовать их в шаблоне. – rrd

+0

У вас есть. К сожалению, у нас нет такой роскоши, поскольку все эти функции уже написаны в jQuery :(Мы решили это, отключив кэширование шаблонов на глобальном уровне (см. Обновленный вопрос). Спасибо за вашу помощь. – thiag0