没有名称的表单控件的值访问器 - Angular 5

Posted

技术标签:

【中文标题】没有名称的表单控件的值访问器 - Angular 5【英文标题】:No value accessor for form control with name - Angular 5 【发布时间】:2018-04-30 13:02:22 【问题描述】:

这是所面临的确切错误:

QuizComponent.html:11 ERROR 错误:表单控件没有值访问器 名称:'s'

我正在尝试使用 JSON 创建一个带有 4 个选项(按钮)的测验应用程序。用户提供的答案与单击 Next 按钮时提供的 JSON 答案进行比较。我在这里看到了关于此的其他搜索结果要求使用表单的错误,但由于我没有创建任何具有显式输入但按钮的简单值的东西,我猜不应该使用表单。

PS:在我在 HTML 中为测验选项实现可点击按钮之前,这段代码运行良好。我之前使用的是单选按钮。ngModel 双向绑定有问题,如果我从按钮中删除 ngModel 标记,或者如果我在其中编写 ngModel,则不显示按钮,因为 HTML 代码是否正确显示,所以我真的不确定它是什么。

HTML:

 <div *ngFor="let actiVar of activeArray ;let j = index">

        actiVar.QuestionID.actiVar.Question
        <br>
        <br>

        <button type="button" name="s" id="oneans" [(ngModel)]="hello" [value]="actiVar.OP[j+0]" [disabled]="permission">actiVar.OP[j+0]</button>
        <br>
        <br>
        <button type="button" name="s" id="oneans" [(ngModel)]="hello" [value]="actiVar.OP[j+1]" [disabled]="permission">actiVar.OP[j+1]</button>        <br>
        <br>
        <button type="button" name="s" id="oneans" [(ngModel)]="hello" [value]="actiVar.OP[j+2]" [disabled]="permission">actiVar.OP[j+2]</button>        <br>
        <br>
        <button type="button" name="s" id="oneans" [(ngModel)]="hello" [value]="actiVar.OP[j+3]" [disabled]="permission">actiVar.OP[j+3]</button>
        <br>
      </div>
<button type="button" class="btn btn-light" id="button1" *ngIf="this.fLoop != this.questArray.length" (click)="filterAnswer(hello)">Next</button>

.TS:

filterAnswer(i: any) //Comparing Answer submitted by user with JSON provided answer
  
    this.correctAns = this.activeArray[0].isRight;
    this.lastIndex = this.activeArray[0].QuestionID;
    if (this.correctAns == i && this.correctAns != this.storeArray[this.storeCounter - 1]) 
       console.log(i);

      this.storeArray[this.storeCounter] = i; //Only the correct answer provided by user gets stored here.
      this.storeCounter++;

      this.scoreCounter++;

    

【问题讨论】:

为什么要在按钮标签上使用[(NgModel)] 指令? 理想的方法应该是什么?据我所知,之前在按钮上使用 ngModel 对我有用。 还有,为什么会有几个同名/id的元素,这是html编码的反模式。 同名 - 因此只能在一个点和相同的 id 上选择一个答案 - 对于 css。 Angular 中的双向绑定是模型和视图之间的同步。当模型中的数据发生变化时,视图会反映变化,当视图中的数据发生变化时,模型也会更新,对于按钮标签,您应该使用events 而不是[(ngModel)] 指令 【参考方案1】:

我不会在按钮上使用 ngModel。使用简单(点击)事件并将数据存储在变量中。做这样的事情:

<button type="button" name="s" id="oneans" [disabled]="permission" (click)="getUsersAnswer(actiCar,OP[j+0])">actiVar.OP[j+0]</button>

并且在您的 .ts 文件中将该值存储在某个变量中:

getUsersAnswer(answer: any) 
   this.i = answer;

【讨论】:

我很高兴能帮上忙! :)

以上是关于没有名称的表单控件的值访问器 - Angular 5的主要内容,如果未能解决你的问题,请参考以下文章

有没有更好的方法将值推送到表单控件,其中数组作为 Angular 中的值

如何在 Angular 的反应式表单中设置表单控件的值

Angular 2 - 自定义表单控件 - 禁用

Ionic3/Angular 错误:必须为表单控件提供一个值,名称为:'jobStatus'

* ngFor-错误名称控件的无值访问器

clearvalidators 不能在 Angular 6 表单控件中工作