2016-09-13 124 views
1

問題背景:如何重定向到主視圖頁面刷新後 - 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 

我想重定向到home.html的視圖時results.html被刷新。目前,當results.html被刷新時,所有y範圍數據都會隨着指令中的jquery插件對象狀態一起丟失。

驗證碼:

app.js - 這房子的應用程序的途徑:

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> 

回答

1

使用$ 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('/'); 
      } 
     }); 
}]); 
+0

感謝您的回覆。這些代碼需要放在哪裏?在ResultsController.js中? – user1352057

+0

是的,哥們!如果你想和run一起運行,只需在.config()後寫入主應用程序文件中.run() – KrishCdbry

+0

再次感謝您的回覆。我編輯了我的原始帖子。儘管如此,它仍然沒有重定向到主頁。 – user1352057

1

一些僞代碼

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

如果結果數據ISN」 t可用只是做$狀態。回家');在ResultsController

+0

感謝您的回覆Ronnie。我確實想過只是檢查$ scope數據,如果它是空的,然後像你顯示的那樣返回。這是否是一種有效的方式? – user1352057

+0

我不明白爲什麼不。我以前做過。 Charli的回答也會起作用。 – Ronnie

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'); 
}); 
+0

感謝您的回覆。我已經把它放在我的結果控制器中,但它似乎從未觸發過?代碼從未被擊中。 – user1352057

+1

如果有重複,請標記爲這樣。 – Li357