【问题标题】:How to create a simple pagination/carousel in divs HTML Angular 2如何在 div HTML Angular 2 中创建一个简单的分页/轮播
【发布时间】:2017-06-09 11:20:03
【问题描述】:

您好,我的模板中有一个 *ngFor,它会创建 n 个 div。

<div *ngFor="let item of widgets" class="page-content widget-item">
  <div>{{content}} </div>
</div>

如何在我的 div 中添加一个简单的分页?这样我的第一页将有 10 个 div,然后单击一个按钮,页面会滑动并显示其余的 div?任何想法?提前致谢。

【问题讨论】:

    标签: angular pagination carousel


    【解决方案1】:

    你需要像这样创建一个服务:

    import * as _ from 'underscore';
    
    export class PagerService {
    getPager(totalItems: number, currentPage: number = 1, pageSize: number = 10) 
    {
        // calculate total pages
        let totalPages = Math.ceil(totalItems / pageSize);
    
        let startPage: number, endPage: number;
        if (totalPages <= 10) {
            // less than 10 total pages so show all
            startPage = 1;
            endPage = totalPages;
        } else {
            // more than 10 total pages so calculate start and end pages
            if (currentPage <= 6) {
                startPage = 1;
                endPage = 10;
            } else if (currentPage + 4 >= totalPages) {
                startPage = totalPages - 9;
                endPage = totalPages;
            } else {
                startPage = currentPage - 5;
                endPage = currentPage + 4;
            }
        }
    
        // calculate start and end item indexes
        let startIndex = (currentPage - 1) * pageSize;
        let endIndex = Math.min(startIndex + pageSize - 1, totalItems - 1);
    
        // create an array of pages to ng-repeat in the pager control
        let pages = _.range(startPage, endPage + 1);
    
        // return object with all pager properties required by the view
        return {
            totalItems: totalItems,
            currentPage: currentPage,
            pageSize: pageSize,
            totalPages: totalPages,
            startPage: startPage,
            endPage: endPage,
            startIndex: startIndex,
            endIndex: endIndex,
            pages: pages
        };
       }
    }
    

    然后像下面这样改变你的组件:

    import { Component, OnInit } from '@angular/core';
    import { Http, Headers, RequestOptions, Response } from '@angular/http';
    import { Observable } from 'rxjs/Observable';
    import 'rxjs/add/operator/map'
    
    import * as _ from 'underscore';
    
    import { PagerService } from './_services/index'
    
    @Component({
      moduleId: module.id,
       selector: 'app',
       templateUrl: 'app.component.html'
     })
    
    export class AppComponent implements OnInit {
    constructor(private http: Http, private pagerService: PagerService) { }
    
    // array of all items to be paged
    private allItems: any[];
    
    // pager object
    pager: any = {};
    
    // paged items
    pagedItems: any[];
    
    ngOnInit() {
        // get dummy data
        this.http.get('./dummy-data.json')
            .map((response: Response) => response.json())
            .subscribe(data => {
                // set items to json response
                this.allItems = data;
    
                // initialize to page 1
                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);
    }
    }
    

    你的 HTML 应该是这样的:

    <div>
    <div class="container">
        <div class="text-center">
            <h1>Angular 2 - Pagination Example with logic like Google</h1>
    
            <!-- items being paged -->
            <div *ngFor="let item of pagedItems">{{item.name}}</div>
    
            <!-- pager -->
            <ul *ngIf="pager.pages && pager.pages.length" class="pagination">
                <li [ngClass]="{disabled:pager.currentPage === 1}">
                    <a (click)="setPage(1)">First</a>
                </li>
                <li [ngClass]="{disabled:pager.currentPage === 1}">
                    <a (click)="setPage(pager.currentPage - 1)">Previous</a>
                </li>
                <li *ngFor="let page of pager.pages" [ngClass]="{active:pager.currentPage === page}">
                    <a (click)="setPage(page)">{{page}}</a>
                </li>
                <li [ngClass]="{disabled:pager.currentPage === pager.totalPages}">
                    <a (click)="setPage(pager.currentPage + 1)">Next</a>
                </li>
                <li [ngClass]="{disabled:pager.currentPage === pager.totalPages}">
                    <a (click)="setPage(pager.totalPages)">Last</a>
                </li>
            </ul>
        </div>
    </div>
    </div>
    

    你可以在这里看到一个例子:

    https://plnkr.co/edit/vPXf2U?p=preview

    【讨论】:

    • 嗨,Emad,如果我不想使用引导程序怎么办。只是一个基于 div 数量的点按钮?
    • 在这个例子中,bootstrap 只用于样式,如果你不使用它,分页仍然可以正常工作,但当然你需要自己从头开始样式
    【解决方案2】:

    【讨论】:

    • 其实不是在找分页。实际上正在寻找一个滑块
    猜你喜欢
    • 1970-01-01
    • 2018-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多