Angular checkbox 遭遇双向绑定问题

初学Angular 时遇到过关于checkbox 双向绑定的问题,看代码:

爱好:
    <span *ngFor="let item of userInfo.hobby; let key = index;">
      <input type="checkbox" [id]="'check'+key" [(ngModel)]="item.checked" /><label [for]="'check'+key">{{item.title}}</label>
    </span>
userInfo = {
    hobby: [
      {title: '跑步', checked: false}, 
      {title: '登山', checked: true}, 
      {title: '游泳', checked: true}, 
      {title: '手游', checked: false}
    ]
  };

运行后,控制台报错:

ERROR Error: "If ngModel is used within a form tag, either the name attribute must be set or the form
      control must be defined as 'standalone' in ngModelOptions.

      Example 1: <input [(ngModel)]="person.firstName" name="first">
      Example 2: <input [(ngModel)]="person.firstName" [ngModelOptions]="{standalone: true}">"
    Angular 9
    View_RegisterFormComponent_2 RegisterFormComponent.html:17
    Angular 31
RegisterFormComponent.html:17:6

嗯嗯,意思是如果使用ngModel,那么必须要给form 标签添加name,或者使用[ngModelOptions]="{standalone: true}"。

添加name后,错误消失,但又出现新的问题。我的初始值之中‘登山’和‘游泳’是要被选中的,然鹅,运行后并没有选中,反复折腾后,终于发现问题所在。因为我所有的checkbox 使用的name 相同,而checkbox 的checked attr(关于attr 和prop 的区别请自行查找)的值以最后一个checkbox 的值为准(原理没搞懂)。也就是说,最后一个为true,则所有的都选中,最后一个为false,则都不选中。。。

无奈之下,我将name 删除,用了第二种解决方案,即使用[ngModelOptions]="{standalone: true}",这一次成功初始化,该选的都选了。

虽然功能没问题了,但我还是有点小纠结,就不能给checkbox 设置name 吗?可能谷歌觉得使用了双向绑定,你没必要在使用form 表单提交来获取数据吧!

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,712评论 1 45
  • 第一章 入门 基本功能:访问和操作 dom 元素,控制页面样式,对页面的事件处理,与ajax完美结合,有丰富的插件...
    X_Arts阅读 1,066评论 0 2
  • AngularJS是什么?AngularJs(后面就简称ng了)是一个用于设计动态web应用的结构框架。首先,它是...
    200813阅读 1,647评论 0 3
  • width: 65%;border: 1px solid #ddd;outline: 1300px solid #...
    邵胜奥阅读 4,887评论 0 1
  • //注意: 操作checkbox的checked,disabled属性时jquery1.6以前版本用attr,1....
    Mannixxx阅读 2,516评论 0 0