我是Angular 2/4的新手,也是Web开发的新手。我有这个表格,以采购形式收集产品变体的信息。 我已经构建了一个formArray of formGroups of variants,如下面的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,以便我可以从数据库中获取颜色和大小细节。
有关如何实现这一目标的任何建议吗?
提前感谢!
此致 纳文
答案 0 :(得分:2)
我们可以使用valueChanges
的版本,当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!
})
}
}
}
答案 1 :(得分: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个以上的项目,那就做你想做的任何事情。
答案 2 :(得分: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
对象将在 subscribe 内作为闭包可用。