如何混合触发页面刷新的链接,Angular html5Mode = true而不破坏后退按钮?

时间:2013-05-02 11:09:37

标签: angularjs routes coffeescript pushstate

我将介绍有问题的流程......

  • 我加载 google.com (仅作为起点)
  • 我转到 app.com
  • 我导航到 app.com/projects
  • 我导航到 app.com/api/test (通过window.location)
  • 我看到原始的JSON(到目前为止很好......)
  • 我回复,网址更改为 app.com/projects ,但我仍然看到了JSON。
  • 我再次回复,网址更改为 app.com ,但我仍然看到了JSON。
  • 我再次按回来, google.com 加载。
  • 我向前推, app.com 加载正常......一切恢复正常

奇怪的是,只有当Webkit- firefox中的html5Mode = true按需运行时,我才会注意到这一点 ......

。 。

首先,我的 server.coffee 如下所示:

app.get '/partials/:partial', routes.partials
app.get '/api/test', api.test
app.get '*', routes.index

基本上,所有请求都加载索引(引导Angular),视图/部分处理程序除外,以及使用原始JSON响应的测试api路由。

。 。

(我正在使用ui-router模块来管理嵌套视图和UI状态;它使用$urlRouterProvider,这与Angular的$routeProvider非常相似)

其次,我的 app.coffee 如下所示:

app = angular.module('app', ['ui-router'])
.config([
    '$stateProvider'
    '$locationProvider'
    '$urlRouterProvider'
    ($stateProvider, $locationProvider, $urlRouterProvider)->
        $urlRouterProvider
            .when('/api/test', [
                '$window'
                '$location'
                ($window, $location)->
                    $window.location.href = '/api/test'
            ])
            .otherwise('/')
        $stateProvider
            .state 'home',
                url: '/'
                templateUrl: 'partials/index'
                controller: 'IndexCtrl'
            .state 'projects',
                url: '/projects'
                templateUrl: 'partials/projects'
                controller: 'ProjectsCtrl'
        $locationProvider.html5Mode(true).hashPrefix '!'
])

由于一切都是异步的,我不得不使用$window访问window.location.href来触发页面刷新,以便服务器处理路由。

所以我的问题是,我可以将触发页面刷新的链接与Angular的html5Mode混合而不会破坏后退按钮吗?这只是一个Webkit错误,和/或有更好的方法吗?

理想情况下,我让应用程序在Angular上运行 - 但是“about”或“contact”页面(不需要动态或异步)之类的东西将直接从服务器使用常规页面刷新提供...

帮助!

1 个答案:

答案 0 :(得分:18)

两个选项:

  1. 如果您使用的是<a />代码,请指定target="_self"让AngularJS知道它不应捕获其点击(这些链接将由浏览器正常处理)。这不是一个黑客;这是正常记录的行为。
  2. 像往常一样使用$window.location = 'foo'。这是可以接受的。