Angular 响应式表单如何处理异步校验

阅读时长 8 分钟读完

Angular 是现代化的前端框架之一,它提供了一种响应式表单的方式来处理用户输入。在实际开发中,我们经常需要进行表单校验,其中异步校验是一种常见的场景。本文将介绍 Angular 响应式表单如何处理异步校验,包括如何设置异步校验,如何处理异步校验的结果以及如何在表单提交时进行异步校验。

设置异步校验

在 Angular 响应式表单中,我们可以使用 AsyncValidatorFn 来设置异步校验。AsyncValidatorFn 是一个函数,它接收一个控件并返回一个 PromiseObservable。当控件的值改变时,Angular 将调用该函数来进行异步校验。如果校验通过,PromiseObservable 将返回 null,否则返回一个表示错误的对象。

示例代码如下:

-- -------------------- ---- -------
------ - ------------ ----------- ---------------- - ---- -----------------
------ - ---------- - ---- -------

-------- ----------------- ---------------- -
  ------ --------- ------------- ------------ ----- -------- --- -- -- -
    ------ --- ------------------- -- -
      -- ------
      -- -------------- --- ------- -
        --------------- ----------- ---- ---
      - ---- -
        --------------------
      -
      --------------------
    ---
  --
-

----- ------- - --- --------------- ---------------------- --------------------

在上面的代码中,我们定义了一个名为 asyncValidator 的函数,它返回一个 AsyncValidatorFn。该函数接收一个控件并返回一个 Observable。在 Observable 中,我们可以定义异步校验的逻辑,如果校验通过,next(null) 将返回 null,否则将返回一个表示错误的对象。

处理异步校验结果

当控件的值改变时,Angular 将调用异步校验函数并等待校验结果。我们可以使用 valueChangesstatusChanges 来监听控件的值和状态变化,并在异步校验完成后处理校验结果。

示例代码如下:

-- -------------------- ---- -------
------ - --------- - ---- ----------------
------ - ------------ ----------- ---------------- - ---- -----------------
------ - ---------- - ---- -------

------------
  --------- --------------
  --------- -
    ----- ------------------ ----------------------
      ------ ---------------------- --
      ------- -----------------------------
    -------
    ---- -------------------------------------------------
    ---- ------------------------------------------------- -----------
  --
--
------ ----- --------------- -
  ---- - --- -----------
    ----- --- --------------- ---------------------- -------------------------
  ---

  ----------------- ---------------- -
    ------ --------- ------------- ------------ ----- -------- --- -- -- -
      ------ --- ------------------- -- -
        -- ------
        -- -------------- --- ------- -
          --------------- ----------- ---- ---
        - ---- -
          --------------------
        -
        --------------------
      ---
    --
  -

  -------- -
    -- ----------------- -
      -- ----
    -
  -
-

在上面的代码中,我们定义了一个名为 MyFormComponent 的组件,它包含一个响应式表单和一个提交按钮。在表单中,我们定义了一个名为 name 的输入框,它有一个必填校验和一个异步校验。当输入框的值改变时,Angular 将调用异步校验函数并等待校验结果。我们可以在模板中使用 form.get('name').pending 来判断异步校验是否正在进行,并使用 form.get('name').errors?.asyncError 来判断异步校验是否失败。

在表单提交时进行异步校验

在实际开发中,我们经常需要在表单提交时进行异步校验。为了避免在提交时出现错误,我们可以在提交前等待异步校验完成。

示例代码如下:

-- -------------------- ---- -------
------ - --------- - ---- ----------------
------ - ------------ ----------- ---------------- - ---- -----------------
------ - ---------- - ---- -------

------------
  --------- --------------
  --------- -
    ----- ------------------ ----------------------
      ------ ---------------------- --
      ------- ------------- ------------------------ -- -----------------------------
    -------
    ---- -------------------------------------------------
    ---- ------------------------------------------------- -----------
  --
--
------ ----- --------------- -
  ---- - --- -----------
    ----- --- --------------- ---------------------- -------------------------
  ---

  ----------------- ---------------- -
    ------ --------- ------------- ------------ ----- -------- --- -- -- -
      ------ --- ------------------- -- -
        -- ------
        -- -------------- --- ------- -
          --------------- ----------- ---- ---
        - ---- -
          --------------------
        -
        --------------------
      ---
    --
  -

  ----- -------- -
    -- ----------------- -
      -- --------
      ----- -----------------------------------------------
      -- ------------------------------ -
        -------
      -
      -- ----
    -
  -
-

在上面的代码中,我们在提交按钮上使用了 [disabled]="form.invalid || form.pending",这将禁用提交按钮并防止在表单无效或正在进行异步校验时提交表单。在 submit 函数中,我们使用 await this.form.get('name').updateValueAndValidity() 来等待异步校验完成,并使用 if (this.form.get('name').errors) 来判断异步校验是否失败。如果异步校验失败,我们将不会提交表单。

总结

Angular 响应式表单提供了一种响应式的方式来处理用户输入,并支持异步校验。在本文中,我们介绍了如何设置异步校验、如何处理异步校验的结果以及如何在表单提交时进行异步校验。希望本文能够帮助你更好地使用 Angular 响应式表单。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6513ff7f95b1f8cacdc79403

纠错
反馈