搜尋
首頁web前端js教程淺析Angular中怎麼結合使用FormArray和模態框

怎麼結合使用FormArray和模態框?以下這篇文章跟大家介紹一下Angular的FormArray和模態框結合使用的方法,希望對大家有幫助!

淺析Angular中怎麼結合使用FormArray和模態框

業務場景

使用FormArray製作動態表單。每建立一個表單,頁面就會新增一個input顯示表單填寫的標題,點選編輯再跳到點擊表單的填寫內容。 【相關教學推薦:《angular教學》】

    // 封装获取modelList
    get modelList() {
        return this.formGroup.get('modelList') as FormArray
    }
    constructor(private fb: FormBuilder) {}
    ngOnInit() {
        // 一开始初始化arr为空数组
        this.formGroup = this.fb.group({
            // 内部嵌套FormControl、FormArray、FormGroup
            modelList: this.fb.array([])
        })
    }
    // 模态框构造内部的表单
    function newModel() {
        return this.fb.group({
            modelName: [''],
            // 可以继续嵌套下去,根据业务需求
        })
    }
    // 省略模态框部分代码
    // 传递到模态框的FormArray
    selectedType: FormArray

表單清單

淺析Angular中怎麼結合使用FormArray和模態框

##表單詳情【模態方塊】

淺析Angular中怎麼結合使用FormArray和模態框

<form [FormGroup]="formGroup">
    <div FormArrayName="modelList">
        <ng-container *nfFor="let item of modelList.controls;let i = index" [FormGroupName]="i">
            <nz-input-group
                [nzSuffix]="suffixIconSearch"
              >
                <input type="text" nz-input formControlName="modelName"/>
              </nz-input-group>
              <ng-template #suffixIconSearch>
                <span
                  nz-icon
                  nzType="edit"
                  class="hover"
                  (click)="showModal(i)"
                ></span>
              </ng-template>
        </ng-container>
    </div>
</form>
<nz-modal
  [(nzVisible)]="isVisible"
  nzTitle="Model"
  [nzFooter]="modalFooter"
  (nzOnCancel)="handleCancel()"
  (nzOnOk)="handleOk()"
>
  <ng-container *nzModalContent>
    <form nz-form [formGroup]="selectedType">
      <nz-form-item>
        <nz-form-label nzRequired>Model Test</nz-form-label>
        <nz-form-control>
          <input
            type="text"
            nz-input
            placeholder="请输入ModelName"
            formControlName="modelName"
          />
        </nz-form-control>
      </nz-form-item>
      <nz-form-item>
        <nz-form-control>
          <product-config></product-config>
        </nz-form-control>
      </nz-form-item>
    </form>
  </ng-container>
  <ng-template #modalFooter>
    <button *ngIf="!isNewModel" nzDanger nz-button nzType="default" (click)="handleDelete()">删除</button>
    <button *ngIf="isNewModel" nz-button nzType="default" (click)="handleCancel()">取消</button>
    <button nz-button nzType="primary" (click)="handleOk()">保存</button>
  </ng-template>
</nz-modal>

由於這個模態方塊比較特殊,割裂了表單的FormGroup之間的關係,在點擊的時候需要傳遞參數到模態框顯示部分值,如果單純傳遞參數使用

this.modelList.at(index)取得實體到模態框上進行賦值修改,在模態框點擊儲存後會發現修改的數值沒有在表單更新,而表單上對input值修改發現可以影響到模態框的內容。

但是模態框新增的表單卻可以回應到頁面中去。

原始錯誤代碼想法

  • 點擊編輯後,將點擊的FormArray的元素傳遞給一個臨時變數

    this.selectedType = this.modelList.at(index);,並且對模態框表單傳值。

  • 模態方塊點選儲存再將原FormArray的值重新替換

  • #
    this.modelList.removeAt(this.modelIndex)
    this.modelList.insert(this.modelIndex, this.selectedType)

  • 點選新增,建立一個新的FormGroup物件

  • 儲存新增push到原頁面的FormArray中

  • newModelType(): FormGroup {
        return this.fb.group({
          modelName: [&#39;&#39;, Validators.required],
          configList: this.fb.array([]),
        });
      }
    // ...省略
    // 模态框显示
    show() {
        this.isVisible = true
        this.selectedType = this.newModelType();
    }
    // 保存
    save() {
        this.isVisible = false
        // 原页面FormArray
        this.modelList.push(this.selectedType);
    }
最後發現這種寫法只能夠單向改變,頁面外input修改值會影響到模態框,但模態框的值改變保存卻讓外部沒有更新。透過console方式查看頁面的FormArray內部參數發現其實是有改變的,只是angular沒有偵測到。這時候判斷沒有發生回應的原因一般是沒有觸發angular偵測機制,仔細檢視文件發現有一行很重要

angular文件在最下面寫著

淺析Angular中怎麼結合使用FormArray和模態框

原本第一次閱讀的時候,覺得我遵守了這種原則,因為在編輯的時候,我選擇了操控原FormArray進行元素刪除和插入,是遵循了這種規則,但是實際上在模態框賦值就已經違反了這個原則,我在賦值的時候拿了FormArray的元素實例賦值給模態框的臨時變量,然後更改實例的值,又重新刪除插入,本質上我操作的是同一個實例,所以angular沒有偵測到發生變化【雖然值改變】

淺析Angular中怎麼結合使用FormArray和模態框

所以正確的做法是啥? ?

在賦值的地方不能偷懶,還是要重新建立新對象,再拿原對象的賦值。 【相當於深拷貝】

      this.selectedType = this.newModelType();
      const old = this.modelList.at(index);
      this.selectedType.setValue({
        &#39;modelName&#39;: old.get(&#39;modelName&#39;).value
    })

這時候就可以正常更新了。

總結

其實要查到最後本質還是回歸文件。在排查錯誤也走了很多坑,而且國內基本上沒什麼angular的文章,還得靠外網論壇去找問題。

更多程式相關知識,請造訪:

程式設計教學! !

以上是淺析Angular中怎麼結合使用FormArray和模態框的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:掘金社区。如有侵權,請聯絡admin@php.cn刪除
Angular学习之聊聊独立组件(Standalone Component)Angular学习之聊聊独立组件(Standalone Component)Dec 19, 2022 pm 07:24 PM

本篇文章带大家继续angular的学习,简单了解一下Angular中的独立组件(Standalone Component),希望对大家有所帮助!

angular学习之详解状态管理器NgRxangular学习之详解状态管理器NgRxMay 25, 2022 am 11:01 AM

本篇文章带大家深入了解一下angular的状态管理器NgRx,介绍一下NgRx的使用方法,希望对大家有所帮助!

项目过大怎么办?如何合理拆分Angular项目?项目过大怎么办?如何合理拆分Angular项目?Jul 26, 2022 pm 07:18 PM

Angular项目过大,怎么合理拆分它?下面本篇文章给大家介绍一下合理拆分Angular项目的方法,希望对大家有所帮助!

聊聊自定义angular-datetime-picker格式的方法聊聊自定义angular-datetime-picker格式的方法Sep 08, 2022 pm 08:29 PM

怎么自定义angular-datetime-picker格式?下面本篇文章聊聊自定义格式的方法,希望对大家有所帮助!

浅析Angular中的独立组件,看看怎么使用浅析Angular中的独立组件,看看怎么使用Jun 23, 2022 pm 03:49 PM

本篇文章带大家了解一下Angular中的独立组件,看看怎么在Angular中创建一个独立组件,怎么在独立组件中导入已有的模块,希望对大家有所帮助!

手把手带你了解Angular中的依赖注入手把手带你了解Angular中的依赖注入Dec 02, 2022 pm 09:14 PM

本篇文章带大家了解一下依赖注入,介绍一下依赖注入解决的问题和它原生的写法是什么,并聊聊Angular的依赖注入框架,希望对大家有所帮助!

Angular的:host、:host-context、::ng-deep选择器Angular的:host、:host-context、::ng-deep选择器May 31, 2022 am 11:08 AM

本篇文章带大家深入了解一下angular中的几个特殊选择器:host、:host-context、::ng-deep,希望对大家有所帮助!

深入了解angular中的@Component装饰器深入了解angular中的@Component装饰器May 27, 2022 pm 08:13 PM

Component是Directive的子类,它是一个装饰器,用于把某个类标记为Angular组件。下面本篇文章就来带大家深入了解angular中的@Component装饰器,希望对大家有所帮助。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前By尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境