106

我正在使用 Angular2-rc5,目前在我的登录页面上出现错误。formcontroll我正在尝试制作一个表单,但控制台抛出异常,告诉我即使我在 init 上创建它也找不到我的 s。知道为什么我会收到此错误吗?

登录组件

import { Component, OnInit } from '@angular/core';
import { FormGroup, FormControl, FormBuilder, Validators } from '@angular/forms';
import { LoginService } from './login.service';
import { User } from '../../models/user';
    
@Component({
    selector: 'login',
    providers: [LoginService],
    templateUrl: './login.component.html',
    styleUrls: ['./login.component.css']
})
export class LoginComponent implements OnInit {
    private loginForm: FormGroup; // our model driven form
    private submitted: boolean; // keep track on whether form is submitted
    private events: any[] = []; // use later to display form changes
    
    constructor(private fb: FormBuilder, private ls:LoginService){}
    ngOnInit(){
        this.loginForm = new FormGroup({
            email: new FormControl('',[<any>Validators.required]),
            password: new FormControl('', [<any>Validators.required, <any>Validators.minLength(6)]),
            rememberMe: new FormControl()
        });
    }
    save(model: User, isValid: boolean) {
        console.log("Test");
        console.log(model, isValid);
    }
    // Login in user
    login(email: any, password: any){
        this.ls.login(email, password, false); 
    }
}

页面.html

<div id="login-page">
    <div class="form-wrapper">
        <form class="login-form" [formGroup]="loginForm" novalidate (ngSubmit)="save(loginForm.value, loginForm.valid)">
            <div >
                <div class="input-field col s12 center">
                    <p class="center login-form-text">Login page</p>
                </div>
            </div>
            <div >
                <div class="input-field col s12">
                    <input id="email" type="email"> 
                    <label class="center-align" for="email" formControlName="email">Email</label>
                </div>
            </div>
            <div >
                <div class="input-field col s12">
                    <input id="password" type="password"> 
                    <label class="center" for="password" formControlName="password">Password</label>
                </div>
            </div>
            <div >
                <div class="input-field col s12 m12 l12 login-text">
                    <input id="remember-me" type="checkbox" formControlName="rememberMe">
                    <label for="remember-me">Remember me</label>
                </div>
            </div>
            <div >
                <div class="input-field col s12">
                    <ahref="index.html">Login</a>
                </div>
            </div>
            <div >
                <div >
                    <p><a href="page-register.html">Register Now!</a></p>
                </div>
                <div >
                    <p><a href="page-forgot-password.html">Forgot password ?</a></p>
                </div>
            </div>
        </form>
    </div>
</div>

例外

例外:未捕获(承诺):错误:./LoginComponent 类 LoginComponent 中的错误 - 内联模板:13:45 原因:没有名称的表单控件的值访问器:'email'.....

4

12 回答 12

164

您将添加formControlName到标签而不是输入。

你有这个:

<div >
  <div class="input-field col s12">
    <input id="email" type="email"> 
    <label class="center-align" for="email" formControlName="email">Email</label>
  </div>
</div>

尝试使用这个:

<div >
  <div class="input-field col s12">
    <input id="email" type="email" formControlName="email"> 
    <label class="center-align" for="email">Email</label>
  </div>
</div>

也更新其他输入字段。

于 2016-12-10T00:27:26.750 回答
60

对于带有角材料的 UnitTest angular 2,您必须在导入部分添加 MatSelectModule 模块。

import { MatSelectModule } from '@angular/material';

beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [ CreateUserComponent ],
      imports : [ReactiveFormsModule,        
        MatSelectModule,
        MatAutocompleteModule,......

      ],
      providers: [.........]
    })
    .compileComponents();
  }));
于 2017-11-18T06:44:04.987 回答
42

对于任何在Angular 9+中遇到这种情况的人

如果您不声明您的组件或导入声明该组件的模块,也可能会遇到此问题。

让我们考虑一下您打算使用ng-select但忘记导入它的情况,Angular 将抛出错误“无值访问器...”

我在下面的 stackblitz 演示中重现了这个错误。

于 2020-11-29T16:31:21.363 回答
19

如果你遇到这个问题,那么要么

  • formControlName 不在值访问器元素上。
  • 或者您没有为该元素导入模块。
于 2020-05-12T15:00:21.203 回答
9

如果您必须使用formControl. 就像 Ant Design Checkbox 一样。运行测试时可能会抛出此错误。您可以使用ngDefaultControl

<label nz-checkbox formControlName="isEnabled" ngDefaultControl>
    Hello
</label>

<nz-switch nzSize="small" formControlName="mandatory" ngDefaultControl></nz-switch>
于 2020-08-20T23:47:01.597 回答
4

就我而言,我使用的是 ionic,我试图用 jasmine karma 对离子输入进行单元测试。运行测试时,我在 karma 浏览器中收到无值访问器错误。所以我只是将其添加ngDefaultControl到离子输入中,它就解决了这个问题。

<ion-input class="password" [(ngModel)]="user.password" name="password" 
                type="password" #pw="ngModel" required ngDefaultControl>
</ion-input>
于 2021-04-28T10:03:33.443 回答
3

就我而言,我使用 Angular 表单和类似的contenteditable元素,div并且之前遇到过类似的问题。

我写了ng-contenteditable模块来解决这个问题。

于 2017-10-09T20:35:57.773 回答
1

对我来说,我只遇到了离子日期选择器的错误,我不得不将它导入IonicModule到我的延迟加载模块中

于 2021-07-12T03:44:33.090 回答
1

在此处输入图像描述

在此处输入图像描述

您可以在 label 中看到 formControlName ,删除它解决了我的问题

于 2020-11-29T05:59:50.760 回答
1

对我来说,我在 Angular 应用程序中使用了 primeng 下拉菜单。未导入下拉模块。

于 2021-08-06T15:32:05.923 回答
1
    constructor(
    private cdr: ChangeDetectorRef,
    @Optional() 
    @Self() public ngControl: NgControl,
    ) {

    if (ngControl) {
        ngControl.valueAccessor = this;
      }

}

在我的情况下,将此行添加到自定义控件(可重用)组件的构造函数中

if (ngControl) {
        ngControl.valueAccessor = this;
      }
于 2021-07-29T06:17:12.013 回答
1

或者

您需要将您的移动formControlName="controlName"<mat-radio-group>包装器而不是将其绑定到单个<mat-radio-button>元素

于 2021-10-01T20:03:55.377 回答