最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Angular的FormArray和模態(tài)框結(jié)合使用實(shí)例詳解

 更新時(shí)間:2022年11月08日 14:38:55   作者:柒鎏獸  
這篇文章主要為大家介紹了Angular的FormArray和模態(tài)框結(jié)合使用實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

業(yè)務(wù)場(chǎng)景

使用FormArray制作動(dòng)態(tài)表單。每創(chuàng)建一個(gè)表單,頁(yè)面就新增一個(gè)input顯示表單填寫(xiě)的標(biāo)題,點(diǎn)擊編輯再跳轉(zhuǎn)到點(diǎn)擊表單的填寫(xiě)內(nèi)容。

    // 封裝獲取modelList
    get modelList() {
        return this.formGroup.get('modelList') as FormArray
    }
    constructor(private fb: FormBuilder) {}
    ngOnInit() {
        // 一開(kāi)始初始化arr為空數(shù)組
        this.formGroup = this.fb.group({
            // 內(nèi)部嵌套FormControl、FormArray、FormGroup
            modelList: this.fb.array([])
        })
    }
    // 模態(tài)框構(gòu)造內(nèi)部的表單
    function newModel() {
        return this.fb.group({
            modelName: [''],
            // 可以繼續(xù)嵌套下去,根據(jù)業(yè)務(wù)需求
        })
    }
    // 省略模態(tài)框部分代碼
    // 傳遞到模態(tài)框的FormArray
    selectedType: FormArray

表單列表

表單詳情【模態(tài)框】

<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="請(qǐng)輸入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>

由于這種模態(tài)框比較特殊,割裂了表單的FormGroup之間的關(guān)系,在點(diǎn)擊的時(shí)候需要傳遞參數(shù)到模態(tài)框顯示部分值,如果單純傳遞參數(shù)使用this.modelList.at(index)獲取實(shí)體到模態(tài)框上進(jìn)行賦值修改,在模態(tài)框點(diǎn)擊保存后會(huì)發(fā)現(xiàn)修改的值沒(méi)有在表單更新,而表單上對(duì)input值修改發(fā)現(xiàn)可以影響到模態(tài)框的內(nèi)容。

但是模態(tài)框新增的表單卻可以響應(yīng)到頁(yè)面中去。

原錯(cuò)誤代碼思路

  • 點(diǎn)擊編輯后,將點(diǎn)擊的FormArray的元素傳遞給一個(gè)臨時(shí)變量 this.selectedType = <FormGroup>this.modelList.at(index);,并且對(duì)模態(tài)框表單傳值。
  • 模態(tài)框點(diǎn)擊保存再將原FormArray的值重新替換
this.modelList.removeAt(this.modelIndex)
this.modelList.insert(this.modelIndex, this.selectedType)
  • 點(diǎn)擊新增,創(chuàng)建一個(gè)新的FormGroup對(duì)象
  • 保存添加push到原頁(yè)面的FormArray中
newModelType(): FormGroup {
    return this.fb.group({
      modelName: ['', Validators.required],
      configList: this.fb.array([]),
    });
  }
// ...省略
// 模態(tài)框顯示
show() {
    this.isVisible = true
    this.selectedType = this.newModelType();
}
// 保存
save() {
    this.isVisible = false
    // 原頁(yè)面FormArray
    this.modelList.push(this.selectedType);
}

最后發(fā)現(xiàn)這種寫(xiě)法只能夠單向改變,頁(yè)面外input修改值會(huì)影響到模態(tài)框,但是模態(tài)框的值改變保存卻讓外部沒(méi)有更新。通過(guò)console方式查看頁(yè)面的FormArray內(nèi)部參數(shù)發(fā)現(xiàn)其實(shí)是有改變的,只是angular沒(méi)有檢測(cè)到。這個(gè)時(shí)候判斷沒(méi)有發(fā)生響應(yīng)的原因一般是沒(méi)有觸發(fā)angular檢測(cè)機(jī)制,仔細(xì)查看文檔發(fā)現(xiàn)有一行很重要 angular文檔 在最下面寫(xiě)著

原本第一次閱讀的時(shí)候,覺(jué)得我遵守了這種原則,因?yàn)樵诰庉嫷臅r(shí)候,我選擇了操控原FormArray進(jìn)行元素刪除和插入,是遵循了這種規(guī)則,但是實(shí)際上在模態(tài)框賦值就已經(jīng)違反了這種原則,我在賦值的時(shí)候拿了FormArray的元素實(shí)例賦值給模態(tài)框的臨時(shí)變量,然后更改實(shí)例的值,又重新刪除插入,本質(zhì)上操作的是同一個(gè)實(shí)例,所以angular沒(méi)有檢測(cè)到發(fā)生變化【雖然值發(fā)生改變】

this . mode llist. removeAt ( this . mode lIndex )
this . modell ist. insert(this . modelIndex, this . se lectedType)

所以正確的做法是啥??

在賦值的地方不能偷懶,仍然要重新創(chuàng)建新對(duì)象,再拿原對(duì)象的賦值?!鞠喈?dāng)于深拷貝】

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

這時(shí)候就可以正常更新了。

總結(jié)

其實(shí)查到最后本質(zhì)上還是回歸文檔。在排查錯(cuò)誤也走了很多坑,而且國(guó)內(nèi)基本沒(méi)什么angular的文章,還得靠外網(wǎng)論壇去找問(wèn)題。

以上就是Angular的FormArray和模態(tài)框結(jié)合使用實(shí)例詳解的詳細(xì)內(nèi)容,更多關(guān)于Angular FormArray模態(tài)框的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解Angular2表單-模板驅(qū)動(dòng)的表單(Template-Driven Forms)

    詳解Angular2表單-模板驅(qū)動(dòng)的表單(Template-Driven Forms)

    本篇文章主要介紹了詳解Angular2表單-模板驅(qū)動(dòng)的表單(Template-Driven Forms),具有一定的參考價(jià)值,有興趣的可以了解一下
    2017-08-08
  • 詳解AngularJS實(shí)現(xiàn)表單驗(yàn)證

    詳解AngularJS實(shí)現(xiàn)表單驗(yàn)證

    這篇文章主要介紹了AngularJS實(shí)現(xiàn)表單驗(yàn)證,客戶端表單驗(yàn)證是AngularJS里面最酷的功能之一。AngularJS表單驗(yàn)證可以讓你從一開(kāi)始就寫(xiě)出一個(gè)具有交互性和可相應(yīng)的現(xiàn)代HTML5表單,對(duì)AngularJS表單驗(yàn)證感興趣的小伙伴們可以參考一下
    2015-12-12
  • AnglarJs中的上拉加載實(shí)現(xiàn)代碼

    AnglarJs中的上拉加載實(shí)現(xiàn)代碼

    上拉加載,是目前手機(jī)網(wǎng)站加載數(shù)據(jù)的一種常用方式,本文主要講解AnglarJs集成,上拉加載功能。感興趣的朋友跟隨腳本之家小編一起學(xué)習(xí)吧
    2018-02-02
  • Angular2 (RC5) 路由與導(dǎo)航詳解

    Angular2 (RC5) 路由與導(dǎo)航詳解

    這篇文章主要介紹了Angular2 (RC5) 路由與導(dǎo)航的相關(guān)資料,需要的朋友可以參考下
    2016-09-09
  • AngularJS實(shí)現(xiàn)的簡(jiǎn)單拖拽功能示例

    AngularJS實(shí)現(xiàn)的簡(jiǎn)單拖拽功能示例

    這篇文章主要介紹了AngularJS實(shí)現(xiàn)的簡(jiǎn)單拖拽功能,涉及AngularJS事件響應(yīng)及頁(yè)面元素屬性動(dòng)態(tài)操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2018-01-01
  • Angular4.0中引入laydate.js日期插件的方法教程

    Angular4.0中引入laydate.js日期插件的方法教程

    在AngularJs中我們會(huì)不可避免的使用第三方庫(kù),例如jquery插件庫(kù)。下面這篇文章主要給大家介紹了關(guān)于Angular4.0中引入laydate.js日期插件的相關(guān)資料,需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-12-12
  • Angular2內(nèi)置指令NgFor和NgIf詳解

    Angular2內(nèi)置指令NgFor和NgIf詳解

    Directive的概念在Angular 1.x就存在了,我對(duì)它的認(rèn)識(shí)比較模糊,所以直接通過(guò)一些例子來(lái)說(shuō)明。Angular提供的內(nèi)置執(zhí)行有很多,這次使用兩個(gè):ngFor、ngIf。
    2016-08-08
  • 詳解Angular.js指令中scope類型的幾種特殊情況

    詳解Angular.js指令中scope類型的幾種特殊情況

    AngularJs最重要也是最難理解的模塊之一就是它的指令(directive)了,自定義指令配置有很多個(gè)參數(shù),下面這篇文章主要介紹了關(guān)于Angular.js指令中scope類型的幾種特殊情況,需要的朋友可以參考下。
    2017-02-02
  • Angularjs 滾動(dòng)加載更多數(shù)據(jù)

    Angularjs 滾動(dòng)加載更多數(shù)據(jù)

    AngularJS 通過(guò)新的屬性和表達(dá)式擴(kuò)展了 HTML。本文主要給大家介紹Angularjs 滾動(dòng)加載更多數(shù)據(jù)的相關(guān)知識(shí),需要的朋友參考下吧
    2016-03-03
  • AngularJs返回前一頁(yè)面時(shí)刷新一次前面頁(yè)面的方法

    AngularJs返回前一頁(yè)面時(shí)刷新一次前面頁(yè)面的方法

    今天小編就為大家分享一篇AngularJs返回前一頁(yè)面時(shí)刷新一次前面頁(yè)面的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10

最新評(píng)論

潼南县| 扶风县| 武安市| 沾益县| 基隆市| 天柱县| 三台县| 达日县| 乐清市| 海城市| 汽车| 景泰县| 杨浦区| 克山县| 伊春市| 台东县| 鹤峰县| 临安市| 佛坪县| 唐河县| 镇赉县| 茂名市| 韶山市| 镇原县| 吉安市| 麻江县| 阿拉尔市| 江都市| 大埔县| 龙海市| 会宁县| 大同县| 六安市| 泸西县| 隆回县| 讷河市| 青神县| 古丈县| 铜川市| 保山市| 广水市|