AngularJS+Node.jsアプリに無限スクロール機能を実装しました。
これはこのJSfiddleに基づいており、同じように機能します。http://jsfiddle.net/vojtajina/U7Bz9/ HTML :
<div id="fixed" when-scrolled="loadMore()">
<ul>
<li ng-repeat="i in items">{{i.id}}</li>
</ul>
</div>
Javascript:
function Main($scope) {
$scope.items = [];
var counter = 0;
$scope.loadMore = function() {
for (var i = 0; i < 5; i++) {
$scope.items.push({id: counter});
counter += 10;
}
};
$scope.loadMore();
}
angular.module('scroll', []).directive('whenScrolled', function() {
return function(scope, elm, attr) {
var raw = elm[0];
elm.bind('scroll', function() {
if (raw.scrollTop + raw.offsetHeight >= raw.scrollHeight) {
scope.$apply(attr.whenScrolled);
}
});
};
});
</ p>
無限スクロールを実装する理由は、ユーザーがすべてを表示したくない場合を除いて、1000の結果すべてとそれに対応する画像を読み込まないことで、ユーザーの帯域幅を節約するためです。
ただし、AngularJSフィルターを使用して結果内を検索すると、問題が発生します。もちろん、すべての結果がそこにあるわけではないため(ユーザーが一番下までスクロールしていない限り)、検索では必要な結果の一部しか返されません。
次に、検索機能を正しく機能させるために無限スクロール機能を削除しましたが、ページを開くと、ブラウザが上から画像の読み込みを開始するときに、Chromeで新しい問題が発生しました(Firefoxではありません)。次に、「z」で始まるもの(結果の一番下)を検索して結果をフィルタリングすると、Firefoxはフォーカスを切り替え、最初に「z」で始まる結果をロードします(その後、表示されるのはそれらだけです)。ただし、Chromeはリストを介して読み込みを続行するため、アプリ内のすべての画像が読み込まれると、ユーザーには検索結果( "z"の場合)のみが表示されます。
私は、Angularが結果に対して無限スクロールと適切な検索フィルターの両方を同時に提供する方法を探しています。これが不可能な場合は、最初にChromeに表示画像をロードさせる方法。
私は現在、スコープ内のさまざまな配列を使って奇妙なことを試していますが、これまでのところ運がありません。