8

問題の流れを説明します...

  • google.comを読み込みます(開始点として)
  • 私はapp.comに行きました
  • app.com/projectsに移動します
  • app.com/api/testに移動します(window.location 経由)
  • 生の JSON が表示されます (これまでのところ問題ありません...)
  • URL はapp.com/projectsに変更されますが、まだ JSON が表示されます。
  • もう一度押すと、URL がapp.comに変わりますが、まだ JSON が表示されます。
  • もう一度押すと、google.comが読み込まれます。
  • 私は前に進み、app.comは正常にロードされます...すべてが正常に戻ります

奇妙なことに、私がこれを観察したのhtml5Mode = trueは、Webkit の場合のみです。

. . .

まず、私のserver.coffeeは次のようになります。

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

基本的に、ビュー/部分ハンドラーと、生の JSON で応答するテスト API ルートを除いて、すべてのリクエストはインデックス (Angular をブートストラップします) を読み込みます。

. . .

(ネストされたビューと UI の状態を管理するためにui-router$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 '!'
])

すべてが非同期であるため、サーバーがルートを処理できるように、$windowto accessを使用してページの更新をトリガーする必要がありました。window.location.href

私の質問はhtml5Mode、戻るボタンを壊すことなく、ページの更新をトリガーするリンクを Angular のリンクと混在させることはできますか? これは単なる Webkit のバグですか、またはこれを行うためのより良い方法はありますか?

理想的には、Angular からアプリケーションを実行することですが、「about」ページや「contact」ページ (動的または非同期である必要はない) などは、定期的なページ更新を使用してサーバーから直接提供されます...

ヘルプ!

4

1 に答える 1

18

Two options:

  1. If you're using <a /> tags, specify target="_self" to let AngularJS know it shouldn't capture their clicks (those links will be handled by browser normally). This is not a hack; this is normal documented behavior.
  2. Use $window.location = 'foo' as you have been doing. That is acceptable.
于 2013-05-03T09:22:45.220 に答える