如何使用angular2 Reactive表单构建嵌套数组?
[英] How to build nested array by using angular2 Reactive forms?
本文介绍了如何使用angular2 Reactive表单构建嵌套数组?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个像[{权限角色模块":{身份证":1,"legend":"businessModule",团体":[{权限角色组":{身份证":1,允许":{"controleType":"ff",身份证":2,"key":"创建业务"},角色":[{身份证":1,姓名":自己"},{身份证":2,姓名":其他"}]}},{权限角色组":{身份证":1,允许":{"controleType":"ff",身份证":2,"key":"编辑业务"},角色":[{身份证":1,姓名":自己"},{身份证":2,姓名":其他"}]}}]}},{权限角色模块":{身份证":2,"legend":"恐慌模块",团体":[{权限角色组":{身份证":1,允许":{"controleType":"ff",身份证":2,"key":"制造恐慌"},角色":[{身份证":1,姓名":自己"},{身份证":2,姓名":其他"}]}},{权限角色组":{身份证":1,允许":{"controleType":"ff",身份证":2,"key":"编辑恐慌"},角色":[{身份证":1,姓名":自己"},{身份证":2,姓名":其他"}]}}]}}]
我的观点就像附件
当我点击提交按钮时,我期待像 json 一样
<预><代码>[{"name":"aaa","描述":"das",允许":[{permission_id":1,关系":2}]}]
如何使用响应式表单为这种情况构建表单组
我是这样试的
component.ts
roleForm: FormGroup;表单字段:任何;验证表单(){this.formField['rolename'] = new FormControl('', Validators.compose([Validators.required]))this.formField['roledescription'] = new FormControl('', Validators.compose([Validators.required]))this.form_objects.forEach(element => {如果(元素.组){element.group.forEach(PermissionRoleGroup => {this.formField[PermissionRoleGroup.permission.key] = new FormControl({value:''}, Validators.compose([Validators.required]))如果(PermissionRoleGroup.roles){PermissionRoleGroup.roles.forEach(role => {this.formField[role.key] = new FormControl('', Validators.compose([Validators.required]))});}})}});this.roleForm = this.fb.group(this.formField);}
html
<table class="table table-bordered"><tr *ngFor="let permissionRoleGroup of element.group;let j= index;"><table class="table table-bordered" style="margin-bottom: 0px;"><td width="40%"><label class="font-light"><输入类型=复选框"[id]="permissionRoleGroup.permission.key"[formControlName]="permissionRoleGroup.permission.key"[value] = "permissionRoleGroup.permission.value">{{permissionRoleGroup.permission.label }}-{{permissionRoleGroup.permission.ischecked}}标签></td><td width="15%" *ngFor="let role of permissionRoleGroup.roles"><label class="font-light"><输入类型=复选框"[价值] = "角色.价值"[formControlName]="role.key">{{role.label}}-{{role.ischecked}}标签></td></tr>
有了这个,我可以构建表单,在提交过程中,我的表单没有创建 json .
这是 plunker 链接 https://plnkr.co/edit/h2VuBw4uITi6czn98ViS?p=preview
由于我是 angular-2 的初学者,所以请帮助我.
解决方案
我会创建一些像 permissionGroups
这样的属性并扁平化你的数据
permissionGroups: any[];...this.permissionGroups = this.form_objects.reduce((acc, permission) => [...acc, ...permission.group], []);
然后我会像这样构建 formGroup
:
const 权限 = this.permissionGroups.map(group => {返回 this.fb.group({[group.permission.key]:假,角色:this.fb.array(group.roles.map(role => this.fb.control(false)))});});this.roleForm = this.fb.group({角色名称:['',Validators.required],roleDescription: ['', Validators.required],权限:this.fb.array(权限)});
并按如下方式准备html:
<div class="form-group"><label>描述</label><textarea rows="4" class="form-control" formControlName="roleDescription"></textarea>
<div formArrayName="权限"><div class="form-row" *ngFor="let permission of roleForm.controls.permissions.controls; let i = index; "><table [formArrayName]="i"><tr><表格><tr><td><label class="font-light"><input type="checkbox" [formControlName]="permissionGroups[i].permission.key">{{ permissionGroups[i].permission.key }}标签></td><td *ngFor="let role of permission.controls.roles.controls; let j = index;"><label class="font-light" formArrayName="roles"><input type="checkbox" [formControlName]="j">{{ permissionGroups[i].roles[j].name }}标签></td></tr></tr>
<button type="submit">提交</button></表单>
当您提交表单时,您需要将表单值转换为您想要的结果,如下所示:
提交(值){this.result = Object.assign({}, value, {权限:value.permissions.reduce((acc, permission, idx) => {返回权限[this.permissionGroups[idx].permission.key] ?[...acc,{permission_id: this.permissionGroups[idx].permission.id,关系:permission.roles.reduce((rolesAcc, role, roleIdx) => {回归角色?[...rolesAcc, this.permissionGroups[idx].roles[roleIdx].id] : rolesAcc;}, [])}] : ACC}, [])});}
你会看到如下输出:
<代码>{"角色名称": "","角色描述": "",权限":[{"permission_id": 2,关系": [1]},{"permission_id": 2,关系": [1、2]}]}
您可以使用 Plunker 示例
另见
I have an array like
[
{
"PermissionRoleModule":{
"id":1,
"legend":"businessModule",
"group":[
{
"PermissionRoleGroup":{
"id":1,
"permission":{
"controleType":"ff",
"id":2,
"key":"create Business"
},
"roles":[
{
"id":1,
"name":"self"
},
{
"id":2,
"name":"other"
}
]
}
},
{
"PermissionRoleGroup":{
"id":1,
"permission":{
"controleType":"ff",
"id":2,
"key":"edit business"
},
"roles":[
{
"id":1,
"name":"self"
},
{
"id":2,
"name":"other"
}
]
}
}
]
}
},
{
"PermissionRoleModule":{
"id":2,
"legend":"PanicModule",
"group":[
{
"PermissionRoleGroup":{
"id":1,
"permission":{
"controleType":"ff",
"id":2,
"key":"create panic"
},
"roles":[
{
"id":1,
"name":"self"
},
{
"id":2,
"name":"other"
}
]
}
},
{
"PermissionRoleGroup":{
"id":1,
"permission":{
"controleType":"ff",
"id":2,
"key":"edit panic"
},
"roles":[
{
"id":1,
"name":"self"
},
{
"id":2,
"name":"other"
}
]
}
}
]
}
}
]
and my view is like shown in attatchment
when I click submit button I am expecting json like
[
{
"name":"aaa",
"description":"das",
"permission":[
{
"permission_id":1,
"relation":2
}
]
}
]
How to build form group for this case using reactive forms
I tried like this
component.ts
roleForm: FormGroup;
formField: any;
validateForm() {
this.formField['rolename'] = new FormControl('', Validators.compose([Validators.required]))
this.formField['roledescription'] = new FormControl('', Validators.compose([Validators.required]))
this.form_objects.forEach(element => {
if (element.group) {
element.group.forEach(PermissionRoleGroup => {
this.formField[PermissionRoleGroup.permission.key] = new FormControl({value:''}, Validators.compose([Validators.required]))
if (PermissionRoleGroup.roles) {
PermissionRoleGroup.roles.forEach(role => {
this.formField[role.key] = new FormControl('', Validators.compose([Validators.required]))
});
}
})
}
});
this.roleForm = this.fb.group(this.formField);
}
html
<div class="form-row" *ngFor="let element of form_objects; let i = index; ">
<table class="table table-bordered">
<tr *ngFor="let permissionRoleGroup of element.group;let j= index;">
<table class="table table-bordered" style="margin-bottom: 0px;">
<td width="40%">
<label class="font-light">
<input type="checkbox"
[id]="permissionRoleGroup.permission.key"
[formControlName]="permissionRoleGroup.permission.key"
[value] = "permissionRoleGroup.permission.value">
{{permissionRoleGroup.permission.label }}-{{permissionRoleGroup.permission.ischecked}}
</label>
</td>
<td width="15%" *ngFor="let role of permissionRoleGroup.roles">
<label class="font-light">
<input type="checkbox"
[value] = "role.value"
[formControlName]=" role.key">
{{role.label}}-{{role.ischecked}}
</label>
</td>
</table>
</tr>
</table>
</div>
with this I am able to build form , during submission, my form is not creating json .
This is plunker link https://plnkr.co/edit/h2VuBw4uITi6czn98ViS?p=preview
As i am beginner in angular-2 so please help me out.
解决方案
I would create some property like permissionGroups
and flatten your data
permissionGroups: any[];
...
this.permissionGroups = this.form_objects
.reduce((acc, permission) => [...acc, ...permission.group], []);
then i would build formGroup
like this:
const permissions = this.permissionGroups.map(group => {
return this.fb.group({
[group.permission.key]: false,
roles: this.fb.array(group.roles.map(role => this.fb.control(false)))
});
});
this.roleForm = this.fb.group({
roleName: ['', Validators.required],
roleDescription: ['', Validators.required],
permissions: this.fb.array(permissions)
});
and prepare html as follows:
<form [formGroup]="roleForm" (submit)="submit(roleForm.value)">
<div class="form-group">
<label>Name</label>
<input type="text" class="form-control" formControlName="roleName">
</div>
<div class="form-group">
<label>Description</label>
<textarea rows="4" class="form-control" formControlName="roleDescription"></textarea>
</div>
<div formArrayName="permissions">
<div class="form-row" *ngFor="let permission of roleForm.controls.permissions.controls; let i = index; ">
<table [formArrayName]="i">
<tr>
<table>
<tr>
<td>
<label class="font-light">
<input type="checkbox" [formControlName]="permissionGroups[i].permission.key">
{{ permissionGroups[i].permission.key }}
</label>
</td>
<td *ngFor="let role of permission.controls.roles.controls; let j = index;">
<label class="font-light" formArrayName="roles">
<input type="checkbox" [formControlName]="j">
{{ permissionGroups[i].roles[j].name }}
</label>
</td>
</tr>
</table>
</tr>
</table>
</div>
</div>
<button type="submit">Submit</button>
</form>
And when you will submit the form you need to convert form value to your desired result something like this:
submit(value) {
this.result = Object.assign({}, value, {
permissions: value.permissions
.reduce((acc, permission, idx) => {
return permission[this.permissionGroups[idx].permission.key] ?
[
...acc,
{
permission_id: this.permissionGroups[idx].permission.id,
relation: permission.roles
.reduce((rolesAcc, role, roleIdx) => {
return role ? [...rolesAcc, this.permissionGroups[idx].roles[roleIdx].id] : rolesAcc;
}, [])
}
] : acc
}, [])
});
}
and you will see the output like:
{
"roleName": "",
"roleDescription": "",
"permissions": [
{
"permission_id": 2,
"relation": [
1
]
},
{
"permission_id": 2,
"relation": [
1,
2
]
}
]
}
You can play with the code in Plunker Example
See also
这篇关于如何使用angular2 Reactive表单构建嵌套数组?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!