【问题标题】:Issue while Paginating in Angular 2在 Angular 2 中分页时出现问题
【发布时间】:2018-04-19 09:15:11
【问题描述】:

我正在尝试对我正在显示的表格实施分页,但我收到了Cannot read property 'length' of undefined

这是我的组件.ts

     getdata: any[];
    curPage: number;
    pageSize: number;

    ngOnInit() {

        this.getData();

    }


    getData() {
        let headers = new Headers();
        headers.set('Content-Type', 'application/json');
        let getUrl = 'http://jsonstub.com/v1/configs';
        return this.http.get(getUrl, {headers: headers})
        .subscribe(res => {
            this.getdata  = res.json();
            console.log(this.getdata.length);
        });
    }

    numberOfPages() {
    return Math.ceil(this.getdata.length / this.pageSize);
  };

我的 HTML 如下:

            <tbody>
            <tr *ngFor="let mem of getdata | FilterPipe: queryString | slice: (curPage * pageSize) - pagSize :curPage * pageSize">
                <td>
                    <a (click)="getFormgroup(mem.configName) ? addtionalInfo = true : addtionalInfo = false" class="clickable">{{mem.configName}}</a>
                </td>
                <td>{{mem.sources.length}}</td>
                <td>
                    <span *ngFor="let sourceNames of mem.sources; let last=last">
                        {{sourceNames.sourceId}}<span *ngIf="!last">, </span> 
                    </span>
                </td>
            </tr>
            <p class="pagination">
                <button [disabled] = "curPage == 1" (click)="curPage = curPage - 1">PREV</button>
                <span> Page {{curPage}} of {{ numberOfPages() }}</span>
                <button [disabled] = "curPage >= getdata.length/pageSize" (click) = "curPage = curPage + 1">NEXT</button>
            </p>
        </tbody>

我的getdata 是一个长度为 4 的数组,如下所示。

[
{configName: "A", sources: Array(1), queryTimeThresholdInMs: 0},
{configName: "B", sources: Array(3), queryTimeThresholdInMs: 5},
{configName: "C", sources: Array(2), queryTimeThresholdInMs: 5},
{configName: "D", sources: Array(2), queryTimeThresholdInMs: 0}
]

我认为我的逻辑是正确的,而且我正在对数组执行getdata.length,因此不确定为什么会弹出此错误。

编辑:我通过getdata() 函数更新为在http.get 之后调用numberofPages(),但我得到了同样的错误。

    getData() {
    let headers = new Headers();
    headers.set('Content-Type', 'application/json');
    let getUrl = 'http://jsonstub.com/v1/configs';
    return this.http.get(getUrl, {headers: headers})
    .subscribe(res => {
        this.getdata  = res.json();
        console.log(this.getdata);
    },
    () => {
        this.numberOfPages();
    });

}

【问题讨论】:

  • @Vega 它是一个表单组数组。
  • @Vega 好吧,我只是在getdata 中获取json 格式的数据,并将源部分显示为{{mem.sources.length}}
  • 您在哪一行得到错误?在subscribe 回调中,还是在return Math.ceil(this.getdata.length / this.pageSize) 行中?因为当然你会在后一种情况下得到一个错误。
  • @kshetline 是的,我在返回语句中收到错误,在 HTML 中它指向 &lt;button [disabled] = "curPage == 1" (click)="curPage = curPage - 1"&gt;PREV&lt;/button&gt;

标签: angular typescript pagination


【解决方案1】:

这是一个异步时序问题。您在return Math.ceil(this.getdata.length / this.pageSize) 中收到错误,因为您的代码中没有任何内容可以确保来自您的http.getsubscribe 回调首先完成执行。

确保在http.get 成功执行之前不要调用numberOfPages() 方法。

您可以通过像这样初始化getdata 来消除错误:

getdata: any[] = [];

至少这种方式numberOfPages() 将首先返回 0 而不是因错误而失败。绕过错误后,一旦收到http.get 响应,它甚至可以从 0 正确更新为正确的页数。

【讨论】:

  • 我确保我在ngOnInit()上拨打http.get
  • 是的,但是在 ngOnInit() 之后调用 http.get 是不够的。它不能保证 http 响应后numberOfPages 的时间。我会解释更多,但我现在在手机上,很难输入技术内容!
  • 请检查我的问题。我已经编辑了我的函数。
  • 我已经查看了您现在的代码,但仍然无法解决计时问题。我将通过编辑上面的答案来建议解决方法。
猜你喜欢
  • 1970-01-01
  • 2021-09-12
  • 2016-09-22
  • 2016-01-03
  • 1970-01-01
  • 1970-01-01
  • 2016-10-11
  • 1970-01-01
  • 2021-12-31
相关资源
最近更新 更多