9

我是 Angular 2/4 的新手,也是 Web 开发的新手。我有这个表格,它在购买表格中收集产品变体的信息。我已经构建了一个 formArray 的 formGroups 变体,如下面的 HTML 所示。

<form [formGroup]="this.purchaseInvoiceItemVariantsForm" novalidate>
    <div formArrayName="variants">
        <div *ngFor="let variant of this.purchaseInvoiceItemVariantsForm.controls.variants.controls; let i = index">
            <div [formGroupName]="i">
                <md-input-container>
                    <input mdInput placeholder="Product Code"  formControlName="productBarcode" class="input--small" [readonly]="this.mode == 'view'">
                </md-input-container>
                <md-input-container>
                    <input mdInput placeholder="Color" formControlName="variant1" class="input--small" [readonly]="this.mode == 'view'" required>
                </md-input-container>
                <md-input-container>
                    <input mdInput placeholder="Size" formControlName="variant2" class="input--small" [readonly]="this.mode == 'view'" required>
                </md-input-container>
                <md-input-container>
                    <input mdInput placeholder="MRP" formControlName="mrp" class="input--small" [readonly]="this.mode == 'view'">
                </md-input-container>
                <md-input-container>
                    <input mdInput placeholder="Purchase Price" formControlName="purchasePrice" class="input--small" [readonly]="this.mode == 'view'"
                        required>
                </md-input-container>
                <md-input-container>
                    <input mdInput placeholder="Sell Price" formControlName="sellPrice" class="input--small" [readonly]="this.mode == 'view'"
                        required>
                </md-input-container>
                <md-input-container>
                    <input mdInput placeholder="Quantity" formControlName="variantQuantity" class="input--small" [readonly]="this.mode == 'view'" required>
                </md-input-container>
                <md-input-container>
                    <input mdInput placeholder="Discount" formControlName="variantDiscount" class="input--small" [readonly]="this.mode == 'view'">
                </md-input-container>
                <button md-icon-button (click)="removeVariant(i)" color="warn" *ngIf="purchaseInvoiceItemVariantsForm.controls.variants.length > 1 && this.mode != 'view'"><md-icon>delete</md-icon></button>
            </div>
        </div>

现在,一旦用户添加了 3 个变体,我希望能够听到 formControl“productBarcode”的 valueChanges,以便我可以从数据库中获取颜色和尺寸的详细信息。

有什么建议可以实现吗?

提前致谢!

问候, 纳文

4

3 回答 3

4

我们可以做一个版本,当-array 长度为 avalueChanges时开始监听。然后我们聆听条形码的每一次变化。variants>= 3

我假设您有一个向variants数组添加新控件的函数,我们可以在那里实现它:

addVariant() {
  // code here for adding control

  // check length   
  if(this.purchaseInvoiceItemVariantsForm.get('variants').length >= 3) {
    // iterate each object in array
    for(let val of this.purchaseInvoiceItemVariantsForm.get('variants').controls) {
      // listen to changes in each barcode, if change, do something!
      val.get('productBarcode').valueChanges.subscribe(data => {
      console.log(val.get('productBarcode').value)
      // do something!
      })
    }
  } 
}

演示

于 2017-04-28T11:57:01.597 回答
1

我会去ngDoCheck()。它不断地监听变化,然后你可以添加一些逻辑。对我帮助很大。

一个例子:

ngDoCheck() {
    if (this.arraOfItems.length > 3) {
        // Do stuff
    }
}

在您的课程中,您应该实现DoCheck,如下所示:

export class myClass implements OnInit, DoCheck {}

这样,如果您设法将您的项目添加到数组中,请说:arraOfItems。然后它将起作用。

文档:https ://angular.io/docs/ts/latest/guide/lifecycle-hooks.html#!#docheck

另一种方法:

在您将项目添加到的逻辑中arraOfItems,进行检查并添加您的逻辑,例如:

addingItemToArray(item) {
    this.arraOfItems.push(item);
    if (this.arraOfItems.length > 3) {
       // do stuff 
    }
}

此示例认为您创建了一个addingItemToArray将项目添加到数组的方法。在其逻辑中,您可以放置​​一个控件来检查数组的长度,如果添加了 3 个以上的项目,则执行您想要执行的任何操作。

于 2017-04-28T10:56:10.903 回答
0

valueChanges控件动态添加到 后用于每个控件FormGroup

const ct = {key: 'myControl'};    
this.myForm.addControl(ct.key, new FormControl('', Validators.required))
this.myForm.controls[ct.key].valueChanges
.subscribe(d => {
    // here ct will be available as closure , so that we can access every form control here and do operation accordingly
    console.log(d, ct.key);
})

这里ct的对象将在订阅中作为闭包可用。

于 2021-05-30T07:26:11.067 回答