【问题标题】:Angular 4: Best practices to catch custom error from modelAngular 4:从模型中捕获自定义错误的最佳实践
【发布时间】:2017-12-24 22:51:59
【问题描述】:

我有一个 Angular4 应用程序,模型在输入数据时执行所有验证工作(如果输入错误,模型会抛出错误并且不设置变量),所以理想的情况是链接任何输入更改直接到与模型相关的 set 方法,这些将使组件非常精简和可扩展。 我的第一个策略是创建一个指令,我通过 setter 方法,我的指令执行 try/catch 句柄

我的 html 是:

<div class="input-field col s12" appFormSetter [setFunction]="session?.getPlayer()?.setName">
   <i class="material-icons prefix">account_circle</i>
   <input #input placeholder="João da Silva" type="text" class="validate" 
          [ngModel]='session.getPlayer()?.getName()' name="name">
   <label for="first_name" class="active">Nome</label>
</div>

指令是:

import { Directive, HostListener, Input, ElementRef } from '@angular/core';
@Directive({
   selector: '[appFormSetter]'
})
export class FormSetterDirective {

  @Input() setFunction;

  @HostListener('input') onInput() {
    try {
        this.setFunction(this.elRef.nativeElement.value);
    } catch (error) {
        // Would catch the error and show in some <small>
        console.log('Error', error);
    }
  }

  constructor(private elRef: ElementRef) {
    console.log('mychildren', this.inputElement);
  }
}

模型将是:

public setName(name: string): void {
    if(!isValid()) throw 'myError';
    this.name = name;
}

处理此类问题的最佳做法是什么? 我可以不通过指令直接通过html得到错误吗?

【问题讨论】:

    标签: angular design-patterns angular2-template angular2-forms


    【解决方案1】:

    您应该使用ReactiveFormsModule。它具有变更检测和验证处理功能。
    我给出了一个答案,其中涉及 cookie 和所需验证的模板 here
    下载示例,试一试现场示例。

    如果您将鼠标悬停在链接上,您会看到链接中有“final”。另一个你必须手动添加代码。我建议使用“最终”版本。

    此外,如果您转到 Angular.io 并搜索“验证器”,您将能够找到诸如 EmailValidator、PatternValidator 之类的示例。这是主要的Validators 类。

    如果你想了解更多,Angular 大学有一个很好的课程。
    他们有一个 YouTube 频道,他们的代码在 Github 上。
    您需要确定要从以下视频中查看哪些分支:
    Rxjs and Reactive Patterns Angular Architecture Course”。

    【讨论】:

    • 嘿,谢谢你的回答 =) 我见过反应式表单模块,但它们根本看不到可扩展的。想象一下,我的模型有一个创建和更新页面,这种方法我必须在两个组件中手动包含验证器,实际上我必须复制几乎所有的代码。我想利用我的模型具有可以在代码中的任何位置使用的验证方法这一事实,明白了吗?
    • 这听起来像是一个抽象基类,其中包含两个组件将派生的大部分功能将是一种方法。我原以为一个带有 *ngIF 的组件虽然基于一种模式就足够了......
    • 我想我明白你的意思了,尽管在域模型级别使用了 GORM 和 Grails,但没有在一个地方定义验证器规则。将它放在组件中似乎违反了定义/维护在一个地方的规则......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    • 1970-01-01
    • 2021-01-20
    • 2018-04-23
    相关资源
    最近更新 更多