【发布时间】:2021-06-14 23:16:20
【问题描述】:
这段代码工作正常,模板部分没问题,这里的问题是模板被这个静态值(角色、权限和管理器)填充得很好
但一旦我调用 API 并获取新值并更改角色对象或权限或管理器,表单就会读取初始空值
也许它与订阅有关?主题 ?我不确定,因为我是 Angular 的新手
import { Component, OnInit } from '@angular/core';
import { FormBuilder, FormGroup, FormArray, FormControl, Validators } from "@angular/forms";
import { ManagersService } from "../../managers/managers.service";
import { NotificationService } from "../../notification/notification.service";
import { PermissionsService } from "../../permissions/permissions.service";
import { HttpClient } from "@angular/common/http";
import { environment } from "../../../../environments/environment";
import { Router, ActivatedRoute } from "@angular/router";
import { RolesService } from "../roles.service";
@Component({
selector: 'app-edit-role',
templateUrl: './edit-role.component.html',
styleUrls: ['./edit-role.component.css']
})
export class EditRoleComponent implements OnInit {
isLoading: boolean = false;
roleId: number = +this.route.snapshot.params['id']
roles: any;
originalRole: any = {};
role = { name: '', permissions: [], managers: [] };
// permissions: any = {};
// roles: any = {};
permissions = [
{ id: 1, name: 'Can create category' },
{ id: 2, name: 'Can read category' },
{ id: 3, name: 'Can update category' },
{ id: 4, name: 'Can destroy category' }
];
managers = [
{ id: 1, name: 'Amir' },
{ id: 2, name: 'Asmaa' },
];
constructor(
private http: HttpClient,
private router: Router,
private route: ActivatedRoute,
private fb: FormBuilder,
private notificationService: NotificationService,
private rolesService: RolesService,
private managersService: ManagersService,
private permissionsService: PermissionsService
) {
}
ngOnInit(): void {
this.rolesService.getRoles().subscribe(response => {
this.roles = response.body;
this.originalRole = this.roles.find((el: any) => el.id === this.roleId)
// this.permissions = this.originalRole.permissions;
this.form.patchValue({
'role': {
'name': this.originalRole.name,
'permissions': this.originalRole.permissions.map(a => a.id),
'managers': this.originalRole.managers.map(a => a.id)
}
});
console.log(this.role);
this.isLoading = false;
},
error => {
this.isLoading = false;
this.notificationService.showNotification(
error.error.title,
error.error.details,
'error'
);
})
}
form = new FormGroup({
role: new FormGroup({
name: new FormControl(this.role.name, [Validators.required]),
permissions: new FormArray(
this.permissions.map(
x => new FormControl(this.role.permissions.find(p => p == x.id) != null)
)
),
managers: new FormArray(
this.managers.map(
x => new FormControl(this.role.managers.find(p => p == x.id) != null)
)
)
})
});
get name() {
return this.form.get('role.name') as FormArray;
}
get rolePermisions() {
return this.form.get('role.permissions') as FormArray;
}
get roleManagers() {
return this.form.get('role.managers') as FormArray;
}
submit(form: FormGroup) {
if (form.valid) {
const data = {
role: {
name: this.form.value.role.name,
permisions: this.permissions
.filter((x, index) => form.value.role.permissions[index])
.map(x => x.id),
managers: this.managers
.filter((x, index) => form.value.role.managers[index])
.map(x => x.id)
}
};
console.log(data);
}
}
}
如上所示,使用静态权限数组是可以的,但是当我将新获取的数组分配给权限变量(注释掉的行)时,我仍然得到空的,我是否在这里遗漏了一些东西 -正确填充值?
更新
我不确定你们是否理解我 以更简单的方式
myRole: any = [];
ngOnInit(): void {
this.rolesService.getRoles().subscribe(response => {
let roles = response.body;
let role = roles.find((el: any) => el.id === this.roleId)
console.log(role)
// This logs the role fine
// Now setting the above variable
this.myRole = role
})
console.log(this.myRole)
// This NEVER want to be set, i know i'm missing something simple but i can't get it
}
【问题讨论】:
-
能否请您在stackbliz中模拟这个问题以便调试?
-
您正在使用布尔默认值初始化
permissions和managers的表单控件,但随后在patchValue调用中将它们设置为数字值。这可能会提示您问题可能出在哪里。 -
另外,使用
ActivatedRoute.snapshot时要小心。当 URL 中唯一的更改是当前路由的参数值时,Angular 被允许(并且通常确实)重用您的组件,并且您的组件不会收到这些更改的通知。最好订阅ActivatedRoute.paramMap。见here -
我添加了一个小的更新来解决我遇到的真正问题
标签: angular typescript forms