【问题标题】:Angular 4 check multiple checkboxesAngular 4检查多个复选框
【发布时间】:2018-03-20 16:05:45
【问题描述】:

我有一个用户角色显示为多个复选框的表单:

<div *ngFor="let role of roles">
            <label for="role_{{role.id}}">
              <input type="checkbox" ngModel name="roles" id="role_{{role.id}}" value="{{role.id}}"> {{role.name}} &nbsp;&nbsp;
            </label>
          </div>

从服务器加载的角色对象如下所示,其中包含表单上显示的所有角色:

{id: 1, name: "HQ", description: "A Employee User", created_at: "2017-10-07 10:43:17",…}
1
:
{id: 2, name: "admin", description: "A Manager User", created_at: "2017-10-07 10:43:17",…}
2
:
{id: 3, name: "caretaker", description: "", created_at: null, updated_at: null}

现在我想使用 form.setValue 设置多个复选框,我从服务器加载的用户对象如下所示: 用户对象中的“角色”是分配给用户的角色,需要在表单上检查

{
"id":13,
"name":"Wasif Khalil",
"email":"wk@wasiff.com",
"created_at":"2017-10-07 10:43:17",
"updated_at":"2017-10-09 07:45:34",
"api_token":"LKVCGPGnXZ3LyiCnyiTAg8XTpck6xWlVkeoMBgtoYZWoAOy4b5epNqMz7KG7",
"roles":[
     {"id":2,"name":"admin","description":"A Manager User","created_at":"2017-10-07 10:43:17","updated_at":"2017-10-07 10:43:17","pivot":{"user_id":"13","role_id":"2","created_at":"2017-10-07 10:43:17","updated_at":"2017-10-07 10:43:17"}
     },
     {"id":1,"name":"HQ","description":"A Employee User","created_at":"2017-10-07 10:43:17","updated_at":"2017-10-07 10:43:17","pivot":{"user_id":"13","role_id":"1","created_at":null,"updated_at":null}
     }
   ]
}

在加载用户对象表单后,服务器即时设置值如下:

this.form.setValue({
                        name: user.name,
                        email: user.email,
                        password:"",
                        confirm_password:"",
                        roles: [1] //here im not sure how to set roles
                    });

谁能帮我检查加载的用户角色对象的复选框。 提前致谢

编辑: 很抱歉没有很好地解释它,我已经编辑了我的问题以再次解释这个问题: 用户对象上的角色是分配给用户的角色 而roles对象是要在表单中显示的所有角色的列表,看下图:

【问题讨论】:

  • 我不认识语法,ngModel 不应该是 ngModel="yourvalue" 吗?
  • 为什么不直接覆盖值而不是使用 setValue?
  • 是的,在你的情况下是 ngModel="YourArrayVariable"
  • 其实 [(ngModel)]="yourArrayVariable"
  • 我建议你改用响应式表单来完成你想做的事情。您将需要使用 patchValue,而不是 setValue,因为当您想要更改所有值时使用 setValue,而不仅仅是子集。

标签: javascript angular typescript checkbox


【解决方案1】:

您不必使用响应式表单来完成它。

HTML

  <input ...[checked]="check(user.roles,role.id)" ...>

打字稿:

check(value1, value2){
  return (value1.filter(item => item.id == value2)).length
}

DEMO

【讨论】:

  • 太棒了,谢谢(Y)它起作用了,我只需要做一个改变,你定义的“用户”对象是一个单一的用户对象,所以我不需要在视图上添加另一个 ngfor,我只是将“用户”重命名为“用户”并删除用户 ngfor
  • 一个问题,如果我不添加 ngModel,我无法添加验证,当我添加验证时,它会检查所有复选框,有什么解决方案吗?
  • 很高兴它成功了! :) 更新应该通过添加一个新行来为用户添加缺少的角色,取消选中应该删除它,我猜?是否有要尊重的角色顺序?
猜你喜欢
  • 1970-01-01
  • 2019-02-10
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-08
  • 2015-07-28
相关资源
最近更新 更多