2013-07-17 4 views
26

私はそれを表示した後、ページ上の要素にスクロールしようとしています。 I.私は非常に長いユーザーリストを持っており、リストとして表示しています。各要素には、クリックできる編集アイコンがあります。クリックすると、ページの上部にあるユーザーフォームが表示されます。私はその場所にスクロールしたい。編集ユーザーのクリックでangularjsにスクロール

// helper method to scroll 
    $scope.scrollTo = function (id) { 
    $location.hash(id); 
    $anchorScroll(); 
    } 

$scope.editUser = function (user) { 
    $scope.user = user; // set user 
    $scope.setShowUserForm(true); // show edit form 
    $scope.scrollTo('admin-form'); // scroll to the form 
    } 

これが初めて除いて素晴らしい作品。私はDOMをチェックし、私の 'user-form'要素はDOMにありますが、私が望むのは隠されています。編集ユーザーをクリックすると、初めてスクロールが機能しなくなります。初めてそれが失敗した後、すべては問題ありません。何が変わったのか分かりません。

また、デフォルトで表示するフォームを設定して、DOM内にあることがわかり、編集をクリックすると初めて表示されるようにしました。それも私の問題を解決しませんでした。 DOM内であろうとなかろうと、最初のスクロールが隠れているかどうかは分かりません。

私が間違っていることは何ですか?

編集:

私は何が起こっているか知っていると思うが、私はそれを解決する方法は考えています。私は自分のアプリケーションでルーティングを使用しています。

/#/メイン /#/ adminに私はそれにスクロールを使用しています、私の管理ページが問題を引き起こしている

その:私のようなルートを持っています。あるとき

/#/管理#管理者-形式:ここで私はまでスクロールしたいHTMLです:私はそれをスクロールするために、角度を使用する場合に問題がある

<div id="admin-form"> 
... 
</div> 

はに私のURLを変更しますそれはルートコントローラを押して、スクロールが起こらない理由である私の管理ページをリロードするように思えます。一度私は/#/ admin#admin-form urlにいます。角度は私のルートに変更が見られず、ページをリロードしないので、スクロールが機能します。しかし、私のURLを/#/ adminに戻して、スクロールを実行するボタンをクリックすると、URLが/#/ admin#admin-formに再度変更されます。

これは予期したとおりだと確信していますが、修正方法はわかりません。もしできれば。

+0

もっと多くのコードが表示されます。私は指示の中でこれをやっていると思いますか? –

答えて

60

AngularsルーティングはscrollToがメイン管理ページに戻るために私を再ルーティングので、私の場合には悪いの変化を、ピックアップしているようです。

$ location.hash()をスクロールしてリセットすると、URLの変更が機能しているように見えません。

$scope.scrollTo = function (id) { 
    var old = $location.hash(); 
    $location.hash(id); 
    $anchorScroll(); 
    $location.hash(old); 
    } 


編集

1.4.0いるため、@のtheunexpected1によるコメントで述べたように、角度の$anchorScrollは、あなたが直接URLを更新する必要なしに、パラメータとしてIDを渡すことができますハッシュ:

+2

ありがとう、ITは私のために働いた!これのためにやらなければならないのは愚かなことのようだ。このソリューションがAngularJS.orgの文書の隣にあることを願っています。 –

+0

ありがとうございました!これまでは – Sharov

+2

+1。これに対する解決策は、1.4.0(Ref:https://github.com/angular/angular.js/issues/4568)で公開されています。これは$ anchorScroll( 'hash')が位置ハッシュを更新せずにスクロールすることを意味します – theunexpected1

1

あなたは私のblogとコメントにこのことに関する質問を投稿しました。あなたのコードのすべてを見ずに

は、私はこれだけで推測することができますが、私はあなたを助けるかもしれないいくつか伝えることができます:

  1. はあなたが隠し要素にスクロールすることはできませんが。
  2. 実際のスクロールは、$ digest中に処理される$ anchorScrollによってセットアップされる$ watchによって行われます。
  3. フォーム要素を表示/非表示に設定しているものは、$ digestの$ watchで処理されています。

このように、フォームを表示するために値を処理する前にスクロールを処理しようとしているようです。これを修正するには、フォームを表示するために使用しているコードをリファクタリングするか、$ anchorScrollコールを$タイムアウトでラップして、ショーの時計の後に実行されるようにします。

私は役立つことを願っています。

+0

ありがとう、私は問題を再現したフィドルを手に入れることができるかどうかを確認します。タイムアウトについては、ここでの最善の推測は、これがどれくらいの期間かかると思いますか? show/digestが実行されたときに実行された 'show'コールのコールバックがあったとしても、それがあるとは思わないといいでしょう。 – lostintranslation

+0

いいえ、「即時」のタイムアウトになります:$ timeout(function(){$ anchorScroll();});角度を$ダイジェストを処理してスクロールする前にフォームを表示させるという考え方です。 –

+0

もう1つ:コンソールに何かエラーがありますか?たぶん、これは本当に簡単なことです、$ anchorScrollなどを注入するのを忘れたようですか? (私はあなたのコードを見ることができないのでちょうど考えました) –

3

今後の参考のため、ここではスクロールについて同じ問題が発生したが、nスクロールするためにng-routesを使うと、Ben_Leshの答えは実際には非常に洞察力があります。

私はスクロールするだけでなく、初めてに関して同じ問題に実行しても動作しないをクリックし

$location.hash(id) 
$anchorScroll() 

を使用していました。私の問題は、最初のをクリックしてを設定し、オブジェクトを表示してからスクロールしようとしましたが、スクロール時には、はまだページに表示されませんでした。その後、サイクルの最後に、ページが再描画されます。

2回目のクリックで、要素がに設定されました。が表示されるようになりました。スクロールがうまく機能します。

ソリューションは が

$タイムアウト(関数(){$スコープ。$(適用)}、0)

を呼び出すために、あなたはあなたの要素が見えるようにブール値を設定した後、あります

スクロール機能を呼び出します。このようにして、スクロールする前に強制的に再レン​​ダーします。 Voila!

+0

これは、消化がすでに進行中であるというエラーが発生する可能性があるため、残念ながらうまくいきません。別の解決策は、実行中のダイジェストが終了するまで$ timeoutを使用してスクロールの実行を延期することです –

8

私が特定の要素にスクロールしたいと思った場合、私は何をしようとしているのかを示すURLを更新することに興味がありませんでした(例えば、www.something.com/#adminの#admin-form id -form)

URLを更新せずにスクロールすると、場所のハッシュを更新することなくアンカースクロールを呼び出すことができます。

$anchorScroll('admin-form'); 
+1

メソッドを呼び出して、ここにスクロールしたい要素のクラス名/ IDを追加するだけですか?確かにそれは容易ではありません。 – Brendan

+0

有名なミーキャット「シンプルズ」の言葉を使用するには、 – chris31389

関連する問題