小さなWebアプリにAngularJSを使用していますが、問題が発生しました。 ng-repeat
を使用して、div内にリストを設定しています。 divの高さは固定されており、overflow-y: auto
に設定されています。つまり、リストがdivに対して大きすぎる場合にスクロールバーが表示されます。私の問題は、リストが再描画されたとき、つまりng-repeatが変更されたときに、スクロールバーがdivの上部にリセットされないことです。代わりに、ng-repeatの変更前のスクロールバーの位置にとどまります。これはユーザーエクスペリエンスが非常に悪いです。私は運なしで以下を試しました:
<div id="myList">
<ul>
<li ng-repeat="item in items">{{item}}</li>
</ul>
</div>
<a ng-click="switchItems()">Switch</a>
<script>
function MyApp($scope) {
$scope.switchItems = function() {
$('#myList').scrollTop();
$scope.items = [1, 2, 3, 4]; // new items
};
}
</script>
私は同じ問題を抱えており、通常は次の一般的な指令で解決します。指定されたイベントをリッスンし、そのイベントが発生するたびに、要素をスクロールしてy = 0
。必要なことは$broadcast
リストが変更されたときのコントローラーのイベント。
angular.module("ui.scrollToTopWhen", [])
.directive("scrollToTopWhen", function ($timeout) {
function link (scope, element, attrs) {
scope.$on(attrs.scrollToTopWhen, function () {
$timeout(function () {
angular.element(element)[0].scrollTop = 0;
});
});
}
});
使用法:
// Controller
$scope.items = [...];
$scope.$broadcast("items_changed")
// Template
<div id="myList" scroll-to-top-when="items_changed">
DIVのコンテンツをwatchesというディレクティブを追加するだけです。その後、コンテンツが変更されるたびに上部にスクロールします!このソリューションでは、イベント処理は必要ありません(ここでは不要だと思います)。
mod.directive('scrollToTop', function(){
return {
restrict: 'A',
link: function postLink(scope, elem, attrs) {
scope.$watch(attrs.scrollToTop, function() {
elem[0].scrollTop = 0;
});
}
};
});
HTMLマークアップは、ディレクティブを使用してスクロールをトリガーします。
<div class='myList' data-scroll-to-top='data.items.length'>
<ul>
<li data-ng-repeat='item in data.items'>{{item}}</li>
</ul>
</div>
リストにアイテムを追加すると、DIVが上部にスクロールします!動作コードを使用したjsFiddleを次に示します。 http://jsfiddle.net/pkgbtw59/89/
テーブルボディのスクロールでも同じ問題に直面しました。次の方法で解決しました。
これが私のサンプルhtmlです。
<table id="rateplanmapping-scroll">
<thead>
<th></th>....
</thead>
<tbody >
<tr ng-repeat="data in datas"> //this is the data
<td></td>.....
</tr>
</tbody>
</table>
以下にangularを上にスクロールするコードを示します
<script>
angular.element("#rateplanmapping-scroll tbody")[0].scrollTop=0;
</script>
役に立てば幸いです。
このスクリプトを必要な機能に入れると、特定のことが起こると自動的にトリガーされます。または、イベントに添付することもできます。
Div要素の場合、これは次の方法で実行できます。
http://plnkr.co/edit/0B4zrFTho6GYuPAS0S1A?p=preview
ありがとう。
docs に従って$ anchorScrollを使用することもできます
// set the location.hash to the id of
// the element you wish to scroll to.
$location.hash('bottom');
// call $anchorScroll()
$anchorScroll();
これを$ timeout内にラップする必要があります。
$timeout(function() {
$location.hash('myList');
$anchorScroll();
})