【问题标题】:Ionic 4 pagination离子4分页
【发布时间】:2019-10-12 14:22:35
【问题描述】:

我有一个简单的提供者,它从API url 获取数据,我需要帮助paginate 这个数据并通过IonInfiniteScroll 加载它。

提供者

import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
import { LoadingController } from '@ionic/angular';

@Injectable({
  providedIn: 'root'
})
export class CategoriesService {

  apiUrl = 'https://example.com/api/categories';

  constructor(private http: HttpClient, private loadingCtrl: LoadingController) { }

  getDetails(url) {
    const httpOptions = {
      headers: new HttpHeaders({
        'Accept': 'application/json, text/plain',
        'Content-Type': 'application/json'
      })
    };

    return this.http.get(`${this.apiUrl}/${url}`, httpOptions).pipe(
      map(category => category)
    );
  }
}

模块

import { Component, OnInit } from '@angular/core';
import { Observable } from 'rxjs';
import { CategoriesService } from './../../services/categories.service';
import { LoadingController } from '@ionic/angular';

@Component({
  selector: 'app-categories-details',
  templateUrl: './categories-details.page.html',
  styleUrls: ['./categories-details.page.scss'],
})
export class CategoriesDetailsPage implements OnInit {

  categories: Observable<any>;
  loading: any;

  constructor(
    private categoriesService: CategoriesService,
    public loadingController: LoadingController,
  ) {}

  ngOnInit() {
    this.getData();
  }

  async getData(){
    this.loading = await this.loadingController.create({
      message: 'Please wait...',
      spinner: 'crescent',
      duration: 2000
    });

    await this.loading.present();

    this.categoriesService.getCategories().subscribe((res) => {
      this.categories = res;
      this.hideLoading()
    });
  }

  private hideLoading() {
    this.loading.dismiss();
  }

}

注意loading: any;当前加载只显示加载直到页面加载,它一次返回所有帖子,它与帖子分页或仅加载前10个无关 em>。

这段代码目前运行良好,我只需要进行分页和添加滚动加载。

查看

此代码返回我需要分页的每个类别帖子(帖子)

<ion-content padding>
    <ion-grid>
        <ion-row>
          <ion-list *ngIf="category">
            <ion-item *ngFor="let post of category.posts">
              <ion-avatar slot="start">
                 <img [routerLink]="['/', 'posts', post.url]" [src]="post.image">
              </ion-avatar>
                <ion-label class="ion-text-wrap" [routerLink]="['/', 'posts', post.url]">{{post.title}}</ion-label>
            </ion-item>
          </ion-list>
        </ion-row>
      </ion-grid>
</ion-content>

知道我应该更改哪个部分以及如何更改吗?

【问题讨论】:

标签: angular ionic-framework ionic4


【解决方案1】:

参数化您的 getData() 函数以接收 pageNumber 和/或跳过参数,并在 ion-infinite-scroll 的 (ionInfinite) 输出事件中调用它。使用分页参数修改url变量以获取所需的数据。

另外,当总数据等于获取的数据时,禁用infiniteScroll。

【讨论】:

    【解决方案2】:

    还有另一种方法可以使用您的代码。

     this.categoriesService.getCategories().subscribe((res) => {
          this.categories = res;
          this.hideLoading();
          this.setPage(1);
        });
    
     setPage(page: number) {
            if (page < 1 || page > this.pager.totalPages) {
                return;
            }
    
            // get pager object from service
            this.pager = this.pagerService.getPager(this.allItems.length, page);
    
            // get current page of items
            this.pagedItems = this.allItems.slice(this.pager.startIndex, this.pager.endIndex + 1);
        }
    

    【讨论】:

      【解决方案3】:

      Ionic 4 无限卷轴

      https://ionicframework.com/docs/api/infinite-scroll

      在 home.page.html 文件中

      <ion-header>
        <ion-toolbar>
          <ion-title>
            Ionic Blank
          </ion-title>
        </ion-toolbar>
      </ion-header>
      
      <ion-content padding>
        <ion-button (click)="toggleInfiniteScroll()" expand="block">
          Toggle Infinite Scroll
        </ion-button>
      
        <ion-list>
          <ion-item *ngFor="let item of dataList">
            <ion-label>{{item}}</ion-label>
          </ion-item>
        </ion-list>
      
        <ion-infinite-scroll threshold="100px" (ionInfinite)="loadData($event)">
          <ion-infinite-scroll-content
            loadingSpinner="bubbles"
            loadingText="Loading more data...">
          </ion-infinite-scroll-content>
        </ion-infinite-scroll>
      </ion-content>
      

      home.page.ts

      import { Component, ViewChild } from '@angular/core';
      import { IonInfiniteScroll } from '@ionic/angular';
      
      @Component({
        selector: 'app-home',
        templateUrl: 'home.page.html',
        styleUrls: ['home.page.scss'],
      })
      export class HomePage {
      
        @ViewChild(IonInfiniteScroll) infiniteScroll: IonInfiniteScroll;
      
      
        dataList:any;
      
        constructor() {
          this.dataList = [];
      
          for (let i = 0; i < 25; i++) { 
            this.dataList.push("Item number "+this.dataList.length);
          }
        }
      
      
      
        loadData(event) {
      
          setTimeout(() => {
            console.log('Done');
            for (let i = 0; i < 25; i++) { 
              this.dataList.push("Item number "+this.dataList.length);
            }
            event.target.complete();
      
            // App logic to determine if all data is loaded
            // and disable the infinite scroll
            if (this.dataList.length == 1000) {
              event.target.disabled = true;
            }
          }, 500);
        }
      
        toggleInfiniteScroll() {
          this.infiniteScroll.disabled = !this.infiniteScroll.disabled;
        }
      }
      

      【讨论】:

        猜你喜欢
        • 2015-11-22
        • 1970-01-01
        • 1970-01-01
        • 2020-10-24
        • 2019-01-28
        • 1970-01-01
        • 1970-01-01
        • 2018-08-03
        • 2020-06-05
        相关资源
        最近更新 更多