데이터베이스 용 PouchDB를 사용하고 있으며 이미 내 프로젝트에서 무한 스크롤을 구현하고 있습니다. 첫 번째로드의 경우 40 개의 문서 만 표시되고 다음 스크롤의 경우 40 개의 문서가로드됩니다. 내 데이터베이스의 전체 문서는 약 3000 문서입니다. 무한 스크롤을 할 때 문제가 없지만 무한 스크롤을 사용하여 필터 데이터에 문제가 있습니다. 이미 표시/조회 된 데이터는 검색 할 수 있지만 표시되지 않은 데이터는 검색 할 수 없습니다. 이미로드 된 데이터 만 필터링 할 수 있습니다. 아래는 제 코드입니다.이오닉 2 - 무한 스크롤에서 필터 검색
providers.ts
constructor(public http: Http) {
this.db = new PouchDB('location');
console.log('Hello User Provider',this.db);
this.remote = 'http://data/location';
let options = {
live: true,
retry: true
};
this.db.sync(this.remote, options)
.on('change', function(change){
console.log('Users provider change!', change);
})
.on('paused', function(info){
console.log('Users provider paused!', info);
})
.on('active', function(info){
console.log('Users provider active!', info);
})
.on('error', function(err){
console.log('users provider error!', err)
});
}
getUsers(skip,limit){
var total;
return new Promise(resolve => {
this.db.info().then(function (info) {
total = info.doc_count;
})
this.db.allDocs({
include_docs: true,
descending:true,
limit: limit,
skip:skip
})
.then((result) => {
this.data = [];
result.rows.map((row) => {
if(row.doc._id.substring(0,8) !== '_design/'){
this.data.push(row.doc);
}
})
resolve(this.data);
this.db.changes({live: true, since: 'now', include_docs: true})
.on('change', (change) => {
this.handleChange(change);
})
})
.catch((error) => {
console.log('Error when getUsers!', error);
})
})
}
home.html을
<ion-content class="sample-modal-page">
<ion-searchbar (ionInput)="getItems($event)">
</ion-searchbar>
<ion-item *ngFor = "let user of users (click)="dismiss(user.Description)">
<h3>{{user.Description}}</h3>
<h4>{{user.code}}</h4>
<h4>{{user.branch}}</h4>
</ion-item>
<ion-infinite-scroll (ionInfinite)="doInfinite($event)">
<ion-infinite-scroll-content
loadingSpinner="bubbles"
loadingText="Loading more data...">
</ion-infinite-scroll-content>
</ion-infinite-scroll>
home.ts
코드에서users: any = [];
staff: any = [];
searchQuery: string = '';
skip : any = 0;
limit : any = 40;
constructor(public user: User,public loadingCtrl: LoadingController, public viewCtrl: ViewController, public navCtrl: NavController, public navParams: NavParams)
{
let loadingPopup = this.loadingCtrl.create({
content: 'Loading data...'
});
loadingPopup.present();
//get data from user provider
this.user.getUsers(this.skip,this.limit).then(data => {
this.staff = data;
this.initializeItems();
loadingPopup.dismiss();
});
}
initializeItems() {
this.users = this.staff;
}
getItems(ev) {
this.initializeItems();
var val = ev.target.value;
if (val && val.trim() != '') {
this.users = this.users.filter((user) => {
return (user.Description.toLowerCase().indexOf(val.toLowerCase()) > -1);
})
}
}
doInfinite(infiniteScroll){
setTimeout(() => {
this.skip = this.skip + this.limit;
this.user.getUsers(this.skip,this.limit).then((data) => {
for (var i = 0; i < this.limit; i++) {
this.users.push(data[i]);
console.log('Apa ini sebenarnya',this.users);
}
});
console.log('Sync end');
infiniteScroll.complete();
},250);
}
"getItems"메소드 내에서 서버에서 새 값을 가져와야합니다. . –
서버의 새로운 값은 무엇을 의미합니까? 나는 이것을 얻지 못한다 – Akmal
이 getUsers (skip, limit, filter)처럼 providers.ts에 다른 메소드를 생성한다. 데이터 원본의 레코드를 필터링하려면 필터를 사용하여 레코드를 쿼리해야합니다. 당신의 코드는 당신이 말했듯이로드 된 데이터만을 필터링합니다. –