在页面加载时调用 Ionic 无限滚动功能
Ionic infinite scroll function invoked on page load
我正在使用 ionic 框架创建一个基本的 Feed 应用程序。我进行了复习,但我的 ion-infinite-scroll 遇到了问题。
Feed.html
<ion-content ng-controller="FeedController" >
<ion-refresher pulling-text="Pull to refresh.." on-refresh="get_feeds()" refreshing-text="Fetching ..." refreshing-icon="ion-loading-b">
</ion-refresher>
<ion-list>
<ion-item ng-repeat="question in questions">
<div class="item item-divider">
{{question.question}}
</div>
<div class="item" ng-bind-html="question.answer | trustHtml">
</div>
</ion-item>
</ion-list>
<ion-infinite-scroll
on-infinite="get_more()"
distance="1%">
</ion-infinite-scroll>
</ion-content>
Feed.js
(function(){
"use strict";
angular.module( 'app.controllers' ).controller( 'FeedController',
[ 'eTobb', 'Users', '$scope', '$timeout', function( eTobb, Users, $scope, $timeout) {
var pageIndex = 1;
$scope.questions = [];
$scope.get_feeds = function(pageIndex){
eTobb.get($scope.apiCall, { user_id: Users.id, page: 0 }, function(response) {
if ( response ){
$scope.questions = $scope.questions.concat(response);
console.log($scope.questions);
}
})
.finally(function(){
$scope.$broadcast('scroll.refreshComplete');
$scope.$broadcast('scroll.infiniteScrollComplete');
});
};
$scope.get_more = function(){
$scope.get_feeds(pageIndex);
pageIndex = pageIndex + 1;
console.log('why the hell am i being called?');
};
}
]);
})();
问题
在on-infinite 属性上定义的方法在页面加载时调用两次,然后每次到达页面底部时正常调用(一次)。
有谁知道为什么会这样?
你可以在ion-infinite-scroll上使用ng-if,这样当没有数据时,on-infinite的handler不会被调用。
<ion-infinite-scroll
on-infinite="get_more()"
distance="1%"
ng-if="questions.length">
</ion-infinite-scroll>
我也 运行 遇到了这个问题,但是使用 ng-if 没有解决问题,我也不认为这是解决这个问题的正确方法。
根据 Ionic 的 documentation,您只能使用 ng-if 来指示没有更多数据可用,并防止无限滚动器对 "get_more" 方法进行额外调用。
我发现在页面加载期间发生此意外 "get_more()" 调用的原因是无限滚动条认为在第一次加载期间没有足够的内容(即:初始加载没有提供足够的结果来填满页面),因此它立即发起另一个加载请求。
在我的特定情况下,我已返回足够多的记录来填充页面,但是无限滚动条仍在请求更多。我的列表中大部分都是图片,我认为滚动条调用 "get_more()" 是由于图片加载和检查页面是否已填满之间的时间问题。
无论如何,我的问题的解决方案是告诉它不要立即对负载执行边界检查;您使用立即检查属性来执行此操作,即:
<ion-infinite-scroll immediate-check="false" on-infinite="vm.localDataManager.getData()" ng-if="vm.localDataManager.canGetData()" distance="1%">
'Ionic infinite scroll function invoked on page load'的答案是
immediate-check="false"
在 ion-infinite-scroll
RMD 的回答在计算机上为我解决了这个问题,但是当 运行 我在 Android 上的应用程序时,我的 vm.loadMore()
函数被立即调用,即使 immediate-check="false"
已设置在我的 ion-infinite-scroll
元素上。我通过向控制器和我的 ion-infinite-scroll
元素添加一个辅助变量 vm.initialSearchCompleted = false;
来解决它:
<ion-infinite-scroll
on-infinite="vm.loadMore()"
distance="1%"
immediate-check="false"
ng-if="vm.canLoadMoreResults && vm.initialSearchCompleted">
</ion-infinite-scroll>
当对我的 vm.search()
函数的初始调用完成时,我设置了 vm.initialSearchCompleted = true;
。那解决了问题。
我正在使用 ionic 框架创建一个基本的 Feed 应用程序。我进行了复习,但我的 ion-infinite-scroll 遇到了问题。
Feed.html
<ion-content ng-controller="FeedController" >
<ion-refresher pulling-text="Pull to refresh.." on-refresh="get_feeds()" refreshing-text="Fetching ..." refreshing-icon="ion-loading-b">
</ion-refresher>
<ion-list>
<ion-item ng-repeat="question in questions">
<div class="item item-divider">
{{question.question}}
</div>
<div class="item" ng-bind-html="question.answer | trustHtml">
</div>
</ion-item>
</ion-list>
<ion-infinite-scroll
on-infinite="get_more()"
distance="1%">
</ion-infinite-scroll>
</ion-content>
Feed.js
(function(){
"use strict";
angular.module( 'app.controllers' ).controller( 'FeedController',
[ 'eTobb', 'Users', '$scope', '$timeout', function( eTobb, Users, $scope, $timeout) {
var pageIndex = 1;
$scope.questions = [];
$scope.get_feeds = function(pageIndex){
eTobb.get($scope.apiCall, { user_id: Users.id, page: 0 }, function(response) {
if ( response ){
$scope.questions = $scope.questions.concat(response);
console.log($scope.questions);
}
})
.finally(function(){
$scope.$broadcast('scroll.refreshComplete');
$scope.$broadcast('scroll.infiniteScrollComplete');
});
};
$scope.get_more = function(){
$scope.get_feeds(pageIndex);
pageIndex = pageIndex + 1;
console.log('why the hell am i being called?');
};
}
]);
})();
问题
在on-infinite 属性上定义的方法在页面加载时调用两次,然后每次到达页面底部时正常调用(一次)。 有谁知道为什么会这样?
你可以在ion-infinite-scroll上使用ng-if,这样当没有数据时,on-infinite的handler不会被调用。
<ion-infinite-scroll
on-infinite="get_more()"
distance="1%"
ng-if="questions.length">
</ion-infinite-scroll>
我也 运行 遇到了这个问题,但是使用 ng-if 没有解决问题,我也不认为这是解决这个问题的正确方法。
根据 Ionic 的 documentation,您只能使用 ng-if 来指示没有更多数据可用,并防止无限滚动器对 "get_more" 方法进行额外调用。
我发现在页面加载期间发生此意外 "get_more()" 调用的原因是无限滚动条认为在第一次加载期间没有足够的内容(即:初始加载没有提供足够的结果来填满页面),因此它立即发起另一个加载请求。
在我的特定情况下,我已返回足够多的记录来填充页面,但是无限滚动条仍在请求更多。我的列表中大部分都是图片,我认为滚动条调用 "get_more()" 是由于图片加载和检查页面是否已填满之间的时间问题。
无论如何,我的问题的解决方案是告诉它不要立即对负载执行边界检查;您使用立即检查属性来执行此操作,即:
<ion-infinite-scroll immediate-check="false" on-infinite="vm.localDataManager.getData()" ng-if="vm.localDataManager.canGetData()" distance="1%">
'Ionic infinite scroll function invoked on page load'的答案是
immediate-check="false"
在 ion-infinite-scroll
RMD 的回答在计算机上为我解决了这个问题,但是当 运行 我在 Android 上的应用程序时,我的 vm.loadMore()
函数被立即调用,即使 immediate-check="false"
已设置在我的 ion-infinite-scroll
元素上。我通过向控制器和我的 ion-infinite-scroll
元素添加一个辅助变量 vm.initialSearchCompleted = false;
来解决它:
<ion-infinite-scroll
on-infinite="vm.loadMore()"
distance="1%"
immediate-check="false"
ng-if="vm.canLoadMoreResults && vm.initialSearchCompleted">
</ion-infinite-scroll>
当对我的 vm.search()
函数的初始调用完成时,我设置了 vm.initialSearchCompleted = true;
。那解决了问题。