You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular分页器赋值getRangeLabel后报TypeError: this.test不是函数

Angular分页器getRangeLabel重构后报错解决方法

问题描述

作为Angular新手,在为MatPaginator的getRangeLabel赋值不同方法时,原复制逻辑的代码可以正常运行,但重构为复用公共test方法后,控制台抛出错误:

ERROR TypeError: this.test is not a function
at MatPaginatorIntl.getLabel [as getRangeLabel] (xxx.ts:21:21)
at MatPaginator_Template (paginator.mjs:329:1469)
...

重构后的代码:

private getLabel(page: number, pageSize: number, length: number): string {
  return this.test(page, pageSize, length, false);
}

private getLabelWithSuffix(page: number, pageSize: number, length: number): string {
  return this.test(page, pageSize, length, true);
}

private test(page: number, pageSize: number, length: number, suffix: boolean): string {
  return 'some string result' + (suffix ? '...' : '');
}

原可运行代码:

private getLabel(page: number, pageSize: number, length: number): string {
  return 'some string result'
}

private getLabelWithSuffix(page: number, pageSize: number, length: number): string {
  return 'some string result ...'
}

赋值语句:

this.paginator._intl.getRangeLabel = this.getLabel;

错误原因

核心问题是函数赋值时丢失了this的上下文指向。当直接把this.getLabel赋值给paginator._intl.getRangeLabel后,该函数执行时的this不再指向当前组件实例,而是指向MatPaginatorIntl对象,自然找不到组件内的test方法,所以报错。

原代码能正常运行,是因为getLabel方法没有引用组件实例的任何属性或方法,只是直接返回字符串,即使this指向改变也不会影响结果。

解决方法

有三种常用方案可以修复这个问题:

方案1:使用箭头函数绑定上下文

箭头函数会捕获当前组件的this指向,确保调用getLabel时this依然指向组件实例:

this.paginator._intl.getRangeLabel = (page: number, pageSize: number, length: number) => {
  return this.getLabel(page, pageSize, length);
};

方案2:用bind绑定组件实例的this

通过bind方法显式将函数的this绑定到当前组件:

this.paginator._intl.getRangeLabel = this.getLabel.bind(this);

方案3:直接在箭头函数中调用test方法

如果不需要单独的getLabel方法,也可以直接简化为:

this.paginator._intl.getRangeLabel = (page, pageSize, length) => {
  return this.test(page, pageSize, length, false);
};

完整示例代码

以方案1为例,修改后的组件代码片段:

import { Component, ViewChild } from '@angular/core';
import { MatPaginator } from '@angular/material/paginator';

@Component({
  selector: 'app-your-component',
  templateUrl: './your-component.component.html',
  styleUrls: ['./your-component.component.css']
})
export class YourComponent {
  @ViewChild(MatPaginator) paginator!: MatPaginator;

  ngAfterViewInit() {
    // 修改后的赋值语句
    this.paginator._intl.getRangeLabel = (page, pageSize, length) => this.getLabel(page, pageSize, length);
  }

  private getLabel(page: number, pageSize: number, length: number): string {
    return this.test(page, pageSize, length, false);
  }

  private getLabelWithSuffix(page: number, pageSize: number, length: number): string {
    return this.test(page, pageSize, length, true);
  }

  private test(page: number, pageSize: number, length: number, suffix: boolean): string {
    return 'some string result' + (suffix ? '...' : '');
  }
}

内容的提问来源于stack exchange,提问作者michealAtmi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 04:16:37