2016-09-29 14 views
1

私のアプリでは、プログラムによって、戻るボタンで前のURLに戻ります。ここで私は何をすべきかです:

$window.history.back(); 

さて、前回のURL(コントローラ/テンプレート完全にロードされた)に変更した後、私はいくつかのコードを実行します。 $ window.history.back()の成功を聞くにはどうすればよいですか?以前とまったく同じ位置にスクロールすることを実現したい。私はイベント$stateChangeSuccessで一番上にスクロールしたいが、sbならスクロールしたいので、これを行う必要がある。戻るボタンで戻ると、スクロール位置に戻ります(通常のリスト詳細ビュー - > sbが詳細ビューに移動し、スクロール位置が以前と同じでなければならないリストに戻ります)。残念ながらthisは完全なコントローラ/ビューが読み込まれる前に呼び出されるため、機能しません。

編集

私の計画は以下の通りです。実行中:

var lastScrollPosition = 0; 
$rootScope.$on('$stateChangeSuccess', function(event, toState, toParams, fromState, fromParams) { 
    lastScrollPosition = $(window).scrollTop(); 
    $("html, body").animate({ 
     scrollTop: 0 
    }, 0); 
}); 

$rootScope.backButton = function() { 
    $window.history.back().then(function() { 
     $("html, body").animate({ 
      scrollTop: lastScrollPosition 
     }, 0); 
    }); 
}; 

スクロール位置が変更された場合、それは機能します。また、戻るボタンを押すとbackButton -Functionが呼び出されます。 $window.history.back() -Commandが実行された後、私はSuccess-Functionを呼び出し、保存されたスクロール位置にジャンプして、この機能がどのように達成されたかを知りたいと思います。

+0

アプリケーションはスクロール位置をどのように覚えていますか?考えられるアイデアは、スクロールイベントのリスナーであり、実際のスクロール位置でURLにクエリパラメータを設定します。ルートコントローラは、URLからスクロール位置を受けなければなりません(存在する場合)。 –

+0

それは本当に良いアイデアですが、私はurlがstrを読みやすく/美しく保つべきであるのでsthをurlに追加したくないです。私の計画はどうなっているのか、私の答えを更新しました。 –

+0

あなたは、ブラウザの組み込みの戻るボタンを押しているユーザーの場合も処理したいですか? – yscik

答えて

0

$ stateChangeSuccess($ stateChangeStartで更新された、すべての状態に割り当てられた最後のスクロール位置のマップを持つ)のデフォルトの動作としてスクロール位置の復元を行い、ユーザーはリンクケースを個別にクリックします。これは、リンクケースをより詳細に制御できるためです。

はちょうどあなたが$ stateChangeSuccessコールバックでトップにスクロールしたいということを示すフラグを反転させ、グローバルgo機能を有する、ng-click='go(state, params)'で任意のui-srefを交換してください。

var scrollPositions = {}; 

$rootScope.go = function gotoState(state, params, options) { 
    $rootScope.scroll_to_top = true; 
    $state.go(state, params, options); 
} 

$rootScope.$on('$stateChangeSuccess', function(event, toState, toParams, fromState, fromParams) { 
    $("html, body").animate({ 
     scrollTop: !$rootScope.scroll_to_top && scrollPositions[toState] || 0 
    }, 0); 
    $rootScope.scroll_to_top = false; 
}); 


$rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) { 
    scrollPositions[fromState] = $(window).scrollTop(); 
    }); 
+0

私はアイデアが好きですが、うまくいきません。あなたのコードには2つの構文エラーがあります(10行目はセミコロンで終わってはいけません、17行目を削除してください)。 完全な 'toState'ビューがレンダリングされる前に$ stateChangeSuccessが呼び出されているため、動作しません –

+0

実際にレンダリングが終了するのを待たなければなりません。' $ viewContentLoaded'イベントまたは小さな '$ timeout'を試してください。ロードするコンテンツがあり、その後にスクロールの位置を調整したい場合は、レイアウトに影響を与えるすべてのデータをフェッチして設定した後、各コントローラでカスタムイベントを発生させることができます。 – yscik

+0

私は 'timeout'を使いたくないので、私は' Success Callback'を要求し、タイムアウトは最悪の答えです。私はそれを試しましたが、ビューがレンダリングされる前に必ずスクロールトップを呼び出します。そのために素晴らしい解決策があるとは思いませんでした。他の人がそれをどうやって処理するのですか? –

関連する問題