2013-10-13 28 views
6

私はAngularjsのscrollspyモジュールで作業してきました。私は、ページが動的コンテンツを扱っている場合、scrollspyのデータ(要素の位置)がすぐに時代遅れになる問題にぶつかってきました。このような問題に対処するためのanglejsの方法は何ですか?AngularjsディレクティブがDOM属性値の変更に更新する

DOM操作を実行するディレクティブ$broadcastは、scrollspyモジュールが調べて、その位置データをリファクタリングできるようにするイベントですか?

scrollboxモジュールは、scrollHeightの変更がx秒ごとに$timeoutであることを確認する必要がありますか?

DOM属性値の変更(属性:offsetTopoffsetHeightscrollHeight、データ属性などの属性)をバインドして監視する方法はありますか?

更新:コードなしAdded code base to GitHub

+0

。残念ながら要素の薄暗さに対する変更のイベントはないので、ポーリング$ timeout implがおそらく最善の候補です。少なくとも、それは$ timeout.flush()で簡単にテストできます: – SonOfNun

+0

要素の高さが変更されても、全体的な 'scrollHeight'は...突然、すべてをチェックする必要があります。 – Patrick

答えて

6

変更オブザーバーは、残念ながら、彼らはonly supported by the latest browsersあり、必要な施設であるように見えます。

var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver; 
if(MutationObserver) { 

    for (var i = 0; i < spyService.spies.length; i++) { 
     var spy = spyService.spies[i].scope.spy; 
     var target = document.getElementById(spy); 

     var config = { 
      attributes: true, 
      childList: true, 
      characterData: true, 
      subtree: true 
     }; 
     var observer = new MutationObserver(function(mutations) { 
      mutations.forEach(function(mutation) { 
       console.warn('mutation observation'); 
      }); 
     }).observe(target, config); 
    } 
} 
else { 
    console.warn('no mutation observers here'); 
    $interval(function() { 
     angular.element(document).ready(function() { 
      console.log('refreshing'); 
     }); 
    }, 2000); 

} 

現在、実際に機能するポリフィルを検索しています。

EDIT:変異オブザーバがサポートされていない場合のフォールバックとしてのポーリングを追加しました。

0

私は暗闇の中でビットを刺すんだけど、私はあなたのscrollspyモジュールのチェックをお勧めしますたび$rootScope$digestコールを受信します。したがって、$rootScope.$watchを使用してください。

$rootScope.$watch(function() { 
    // Update scrollspy data here 
} 
+0

申し訳ありませんが、これに戻るために私はある時間を取った。 GitHub上のコードへのリンクを追加しました。 DOMが更新されてレンダリングされると、これは遅く呼び出されますか? – Patrick

+0

はい、AngularJSがディレクティブとコントローラを読み込んでバインドし終えるまで、呼び出されるべきではありません。 –

+0

$ digestの問題に陥っていますが、おそらく現在のコード構造です。残念ながら、これは実際には問題の半分しか処理しません(それがうまくいくと仮定して)。たとえば、クリックすると高さが変更された 'div'は、' scope。$ apply(); 'とも呼ばれない限り捕まえられません。これは、基本的にre-calcメソッドを呼び出すのと同じ要件です... – Patrick

1

何かこれはうまくいくはずです...しかし、CSSトランジションでは更新されないようです。おそらくすぐに手に負えなくなるイベントを発行し、確かで動作するようにあなたのモジュールが非友好的にするために他のディレクティブを拘束

scope.$watch(function(){ 
    return elem[0].offsetLeft; 
}, function(x){ 
    console.log('ITEM AT '+x); 
}); 
関連する問題