【问题标题】:Angular 2 pagination control with input - validation带有输入的Angular 2分页控件 - 验证
【发布时间】:2017-06-02 01:25:50
【问题描述】:

我有一个分页组件。

html: 第一页

    <button md-mini-fab (click)="previous()" [disabled]="isFirstpageButtonDisabled" style="margin:0 0.5rem">
        <md-icon>chevron_left</md-icon>
    </button>
    <input #input type="text" (keyup.enter)="goToPage(input.value)" [(value)]="pageIndex" style="margin:0 0.5rem; width: 40px;">
    / {{totalPages}}
    <button md-mini-fab (click)="next()" [disabled]="isLastpageButtonDisabled" style="margin:0 0.5rem">
        <md-icon>chevron_right</md-icon>
    </button>

    <button md-mini-fab (click)="goToPage(totalPages)" [disabled]="isLastpageButtonDisabled" style="margin:0 0.5rem">
        <md-icon>last_page</md-icon>
    </button>

当用户在输入框中输入无效的数字/字符时,我会显示一条错误消息。我还需要将输入框值恢复为之前有效的数字。

checkPageIndex() {
    this.validpageIndex = true;    

    if (this.pageIndex < 1 || this.pageIndex > this.totalPages || isNaN(this.pageIndex)) {
        this.validpageIndex = false;
        this.toaster.showToaster('Please select a page between 1 and ' + this.totalPages + '.');
        return;
    }
}

我试图通过保存前一页索引并在有效检查失败时分配该值来实现这一点:

this.pageIndex = this.previousPageIndex;

此值已在控制台日志中正确分配,但输入文本框仍显示无效输入。我怎样才能解决这个问题?

【问题讨论】:

  • 你有哪个 ChangeDetectionStrategy ?也许你跑在角度之外?
  • 不确定您所说的 ChangeDetectionStrategy 是什么意思。每次输入是有效数字时,我都会设置 this.previousPageIndex = this.pageIndex;我保存了之前的有效输入,以便在输入无效输入时可以再次使用它。
  • 为了进一步澄清,我在输入控件和组件之间使用了一个简单的变量绑定,例如 typescript 中的 pageIndex: number,然后绑定到输入控件的值。
  • 如果您每次更改 pageIndex 时都保存 previousPageIndex,然后在验证失败时设置 pageIndex = previousPageIndex 就像您写的那样,您的方法将起作用。请参阅下面的答案,例如工作 plunkr

标签: angular pagination grid


【解决方案1】:

您走在正确的轨道上,只需几件事就能让您到达那里。基本上,您希望在更改当前 pageIndex 时随时跟踪 lastPageIndex,然后在检查失败时将当前 pageIndex 设置为 lastPageIndex 中的值。将输入更改为 ngModel 并为文本字段添加一个 on blur 事件以在他们离开时捕获他们的更改也不会受到伤害。如果您的用户可能会尝试将输入更改为其他无效的内容,您可以添加对这些内容的检查,甚至使用 ngOnChanges() 来监控输入以确保。更新后的 goToPage 函数示例可能如下所示

 goToPage(page: number) {
    // check to make sure number is valid
    if(this.pageIndex <= 1 || this.pageIndex >= this.pages.length || isNaN(this.pageIndex)) {
      alert("invalid page selected");
      this.pageIndex = this.lastPageIndex;
    }
    else {
      // update current page and save last index
      this.pageIndex = page;
      this.lastPageIndex = this.pageIndex;
    }
  }

这是一个简化的 plunker,其中包含您的问题的工作示例http://plnkr.co/edit/EFBiVz4gy4nl4mFDe6x1?p=preview

【讨论】:

  • 您的 plunker 示例看起来与我需要的完全一样。当我尝试这样做时,我收到此错误:未处理的承诺拒绝:模板解析错误:无法绑定到“ngModel”,因为它不是“输入”的已知属性。 (" ][(ngModel)]="pageIndex"> / {{totalPages}}
  • 我想通了。必须导入 FormsModule 并且这有效。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2017-09-14
  • 2017-09-14
  • 1970-01-01
  • 1970-01-01
  • 2020-09-30
  • 2023-03-10
  • 2017-10-06
  • 2017-02-21
相关资源
最近更新 更多