我在我的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);
}
});
};
});
我实现无限滚动的原因是为了节省用户的带宽,不会加载所有1000个结果及其相应的图像,除非用户想查看所有内容。
然而,当使用AngularJS过滤器在结果中搜索时,我遇到了问题,因为并非所有结果都在那里(除非用户滚动到底部),所以搜索只会返回一部分所需的结果。
我随后去掉了无限滚动功能,以便让搜索功能正常工作,但这在Chrome上出现了新问题(在Firefox上没有),当我打开页面时,浏览器开始从顶部加载图像。如果我通过搜索以“z”开头的内容(在结果的最底部)来筛选结果,Firefox会切换焦点并首先加载以“z”开头的结果(因为它们是唯一被显示的结果)。然而,Chrome继续按列表顺序加载,因此用户只能在应用程序中的所有图像加载完成后才能看到他们搜索的结果("z")。
我正在寻找一种方法,使Angular同时提供无限滚动和正确的搜索结果过滤器。如果这不可能,则需要一种方法让Chrome先加载可见的图像。
我目前正在尝试使用一堆不同的范围内数组进行一些奇怪的操作,但到目前为止我还没有成功。