如何在页面刷新后重定向到主视图 - AngularJS

时间:2016-09-13 22:41:30

标签: javascript angularjs

问题背景:

我遇到了我正在实施的AngularJS的一个常见问题:

 $locationProvider.html5Mode({ enabled: true, requireBase: false });

这已经删除了#'#'从我的URL路由,然后导致404错误。我通过调整web.config来修复它,现在页面重新加载。

问题:

我有2个名为Home.htmlResults.html的观点。我还有一个index.html,它包含在我的应用程序中,其中包含注册了主页和结果视图的<div ui-view>

以下是使用的路线:

http://localhost:5XXXX/ - home
http://localhost:5XXXX/results - results

我想在刷新results.html时重定向到home.html视图。目前,当刷新results.html时,所有y作用域数据都会随指令中的jquery插件对象状态一起丢失。

守则:

app.js - 这里有app的路线:

 angular
  .module('app', [
    'ui.router',
    'ui.bootstrap',
    'ngAnimate',
    'ngResource',
    'rzModule',
    'angular-ladda',
    'jcs-autoValidate'
  ])
  .config(['$urlRouterProvider', '$stateProvider', '$locationProvider', function ($urlRouterProvider, $stateProvider, $locationProvider) {

      $urlRouterProvider.otherwise('/');
      $stateProvider
        .state('home', {
            url: '/',
            templateUrl: 'home.html',
            controller: 'HomeController'
        })


          $stateProvider.state('results', {
              url: '/results',
              templateUrl: 'Results.html',
              controller: 'ResultsController'
          })

          $locationProvider.html5Mode({
              enabled: true,
              requireBase: false
          });
    }]);

ResultsController.js:

var app = angular.module('app');

app.controller('ResultsController', function ($scope, $rootScope, $timeout, $location, $anchorScroll, $window, searchService) {

    //code

});

如果我刷新Results.html页面,我如何立即重定向到Home.html视图,而不是重新加载Results.html页?

修改

我已使用以下内容更新了ResultsController.js,但这个代码似乎没有在重新加载时调用,它不会重定向到主页。

var app = angular.module('app');

app.controller('ResultsController', function ($scope, $rootScope, $timeout, $location, $anchorScroll, $window, searchService) {

    $rootScope.$on('$locationChangeStart', function (event) {
        $state.go('/');
    });
});

另外要添加我已将以下内容添加到我的应用程序的Web.config中以处理重新路由:

<rewrite>
  <rules>
    <rule name="AngularJS" stopProcessing="true">
      <match url=".*" />
      <conditions logicalGrouping="MatchAll">
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
      </conditions>
      <action type="Rewrite" url="/" />
    </rule>
  </rules>
</rewrite>

3 个答案:

答案 0 :(得分:2)

使用$ locationChangeStart

$rootScope.$on('$locationChangeStart', function(event) {
   $state.go('/');
});

正确代码:$ locationChangeStart 运行
把它放在主应用程序文件中并将其附加到应用程序,如app.config,就像app.run()

一样
.run(['$rootScope', '$state', function($rootScope, $state, userService) {
       $rootScope.$on("$locationChangeStart", function(event, next, current) {
          if(next == current) {
                event.preventDefault();
                $state.transitionTo('/');
            }
       });
}]);

答案 1 :(得分:1)

一些伪代码

var app = angular.module('app');
app.controller('ResultsController', function ($scope, $rootScope, $timeout, $location, $anchorScroll, $window, searchService, $state) {
  if (data unavailable) {
    $state.go('home');
  }
});

如果您的结果数据不可用,请执行$ state.go(&#39; home&#39;);在ResultsController

答案 2 :(得分:1)

看起来已在此处回答:How to redirect on different view on refresh in AngularJS?

$rootScope.$on("$locationChangeStart", function(event, next, current) { 

if(next==current && next=='/results')
    event.preventDefault();
    $state.go('home');
});