我们有一个使用ui-router AngularJS模块的ASP.NET MVC 5应用程序。
当我们返回已加载的状态时,它会始终显示旧数据,直到我们进行整页刷新。
例如:
我们怎样才能强制ui-route在加载任何状态时提取新数据?
Angular config
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 });
使用解决方案编辑 由于所有功能都是使用jQuery编写的,因此我们无法使用Angular控制器来控制数据。我们的解决方案是使用以下代码完全禁用Angular模板缓存:
app.run(function ($rootScope, $templateCache) {
$rootScope.$on('$viewContentLoaded', function () {
$templateCache.removeAll();
});
});
答案 0 :(得分: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();
};
});
}]);
答案 1 :(得分:0)
默认情况下,ui-router状态转换不会重新实例化到State的控制器。
要强制实例化控制器,您可以执行此操作。
//assuming you are using $state.go to go back to previous state
$state.go('to.state', params, {
reload: true
});
答案 2 :(得分:0)
你需要使用resolve,如下所示:
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()'在注射服务中(我说服务'因为我们将从中加载数据)。
然后对于每个州的控制器,它将有权访问loadedData resolve;数据将在该点加载并由该控制器使用。因此,对于您的情况,回到您来自的状态,新更新的数据将再次加载并再次在该状态下可用。
保持状态转换相同,重新加载:true,因为这也是你想要的。