71

経由で AngularJS で html5Mode を有効にする$locationProvider.html5Mode(true)と、サイトのより深いページに移動すると、ナビゲーションが歪んでいるように見えます。

例えば:

  • http://www.site.com
    ルートに移動すると、サイト内のすべてのリンクをクリックできます。Angular がサイト内の$routeProvider移動と正しいビューの読み込みを引き継ぎます。

  • http://www.site.com/news/archive
    しかし、この URL に移動すると (または、上記のようなディープリンクを使用しているときに [更新] をクリックすると)、このナビゲーションが期待どおりに機能しません。まず、$locationProvider.html5Mode のドキュメントで指定されているように、Angular のルートと同様に、サーバー上のすべての URL をキャッチしotherwise、ルート ドメインと同じ html を返します。しかし、angular$locationの関数内からオブジェクトをチェックすると、それが my であり、それが myであることがわかります。私は有効なルートとしてしか持っていないので、句に到着します。アプリは奇妙なことをします。runhttp://www.site.comhost/archivepath$routeProvider.otherwise()/news/archive

サーバーでの書き換えを別の方法で行う必要があるか、角度で指定する必要があるかもしれませんが、現在、角度が/newsセグメントを含まないパスを参照する理由についてはわかりません。

例 main.js:

// Create an application module
var App = angular.module('App', []);

App.config(['$routeProvider', '$locationProvider', function AppConfig($routeProvider, $locationProvider) {

    $routeProvider
        .when(
        '/', {
            redirectTo: '/home'
        })
        .when('/home', {
            templateUrl: 'templates/home.html'
        })
        .when('/login', {
            templateUrl: 'templates/login.html'
        })
        .when('/news', {
            templateUrl: 'templates/news.html'
        })
        .when('/news/archive', {
            templateUrl: 'templates/newsarchive.html'
        })
        // removed other routes ... *snip
        .otherwise({
            redirectTo: '/home'
        }
    );

    // enable html5Mode for pushstate ('#'-less URLs)
    $locationProvider.html5Mode(true);
    $locationProvider.hashPrefix('!');

}]);

// Initialize the application
App.run(['$location', function AppRun($location) {
    debugger; // -->> here i debug the $location object to see what angular see's as URL
}]);

要求に従って編集 します。サーバー側の詳細: サーバー側は zend フレームワークのルーティングによって編成され、独自のルートを処理します (特定の/apiURL でフロントエンドにデータを提供するため、最後にキャッチがあります)。 -all route 特定の他のルートがバインドされていない場合、root-route と同じ html を提供するため、基本的にはそのディープリンク ルートでホームページ html を提供します。

Update 2 で問題を調査した結果、Angular 1.0.7 安定版ではこのルーティングがそのまま正常に機能することに気付きましたが、Angular 1.1.5 不安定版では上記の動作が見られます。

変更ログを確認しましたが、これまでのところ有用なものは見つかりませんでした。バグとして提出するか、彼らが行った特定の変更に関連する望ましくない動作を提出するか、ただ待って修正されるかどうかを確認してください。後で安定版がリリースされます。

4

5 に答える 5

12

これは、私が認めるよりも多くの時間をかけて見つけた最良の解決策でした. 基本的に、ページのリロードを保証する必要がある各リンクに target="_self" を追加します。

http://blog.panjiesw.com/posts/2013/09/angularjs-normal-links-with-html5mode/

于 2014-10-14T18:13:20.623 に答える
9

この問題は、AngularJS 1.1.5 の使用が原因でした (これは不安定であり、明らかにバグがあったり、1.0.7 とは異なるルーティングの実装がありました)。

1.0.7 に戻すと、問題はすぐに解決しました。

1.2.0rc1 バージョンを試しましたが、ルーター機能の一部をコアから取り出して書き直さなければならなかったため、テストは完了していません。

とにかく、AngularJS vs 1.0.7 を使用する場合、この問題は修正されています。

于 2013-08-21T12:07:37.920 に答える