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

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

青灯夜游
發布: 2022-12-20 21:23:06
轉載
2018 人瀏覽過

怎麼結合使用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中文網其他相關文章!

相關標籤:
來源:juejin.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板