当前位置: 首页 > 知识库问答 >
问题:

this.form._updateTreeValidity不是函数

扶誉
2023-03-14

我目前正在使用Angular Forms版本2.0.0,并尝试使用内部的联系表单制作“联系我们”模式。

在ContactComponent加载之后,我立即得到:

例外:this.form._updateTreeValidity不是函数

>

  • 我已经看到其他一些堆栈帖子,它们建议使用FormGroup而不是FormBuilder来初始化组件构造函数中的表单对象,现在是新API的标准配置,所以我已经更新了这一点。

    我导入了ReactiveFormsModule和FormsModules以及所有与表单相关的组件,错误似乎与模块无关。

    我的TypeScript在编译时没有抛出错误,Visual Studio Intellisense似乎能够很好地找到所有FormGroup函数,那么为什么在运行时会出现这种情况呢?...

    我的代码:

    联系人.组件. ts:

    import { Component, Input, ViewChild } from '@angular/core';
    import { ApiService } from '../../../services/api.service';
    import { ModalComponent } from 'ng2-bs3-modal/ng2-bs3-modal';
    import { Router, ActivatedRoute, Params } from '@angular/router';
    import { FormsModule, ReactiveFormsModule, FormGroup, FormControl, Validators } from '@angular/forms';
    import 'rxjs/Rx';
    
    declare var jQuery: any;
    
    @Component({
        selector: 'my-contact',
        templateUrl: 'app/modules/footer/contact/contact.html'
    })
    export class ContactComponent {
    
        private contactForm: FormGroup;
        private invalidEmail: boolean;
        private invalidSubject: boolean;
        private invalidMessage: boolean;
    
        constructor(private apiService: ApiService, private router: Router, private route: ActivatedRoute) {
            this.contactForm = new FormGroup({
                emailControl: new FormControl('', <any>Validators.required),
                subjectControl: new FormControl('', <any>Validators.required),
                messageControl: new FormControl('', <any>Validators.required)
            });
        }
    
        submit() {
    
            if (this.contactForm.valid) {
                this.apiService.sendMessage(this.contactForm.controls['emailControl'].value, this.contactForm.controls['subjectControl'].value, this.contactForm.controls['messageControl'].value);
            }
    
            if (!this.contactForm.controls['emailControl'].valid) {
                this.invalidEmail = true;
            }
            if (!this.contactForm.controls['subjectControl'].valid) {
                this.invalidSubject = true;
            }
            if (!this.contactForm.controls['messageControl'].valid) {
                this.invalidMessage = true;
            }
    
        }
    
        ngOnInit() {
            this.invalidEmail = false;
            this.invalidSubject = false;
            this.invalidMessage = false;
        }
    
    }
    

    contact.html:

    <modal-header class="c-no-border" [show-close]="true">
      <h4 class="modal-title text-uppercase">Send us a message</h4>
    </modal-header>
    
    <form novalidate #contactForm [formGroup]="contactForm" (ngSubmit)="submit()">
      <div class="modal-body">
        <div class="form-group">
          <label for="email" class="control-label">Email</label>
          <input name="email" formControlName="emailControl" placeholder="" type="text" class="c-square form-control c-margin-b-20" id="email">
          <div class="c-font-red-1" *ngIf="invalidEmail" style="position: absolute;">*Required</div>
          <label for="subject" class="control-label">Subject</label>
          <input name="subject" formControlName="subjectControl" placeholder="" type="text" class="c-square form-control c-margin-b-20" id="subject">
          <div class="c-font-red-1" *ngIf="invalidSubject" style="position: absolute;">*Required</div>
          <textarea formControlName="messageControl" style="resize: vertical;" class="c-square form-control c-margin-b-20" id="content" (keyup.enter)="submit()"></textarea>
          <div class="c-font-red-1" *ngIf="invalidMessage" style="position: absolute;">*Required</div>
        </div>
      </div>
      <modal-footer class="c-no-padding">
        <button type="button" class="btn c-btn-square c-btn-bold c-btn-uppercase pull-right">Cancel</button>
        <button type="submit" class="btn c-theme-btn c-btn-square c-btn-bold c-btn-uppercase pull-right" style="margin-right: 10px;">Send</button>
      </modal-footer>
    </form>
    

    app.module.ts:

    import { NgModule, enableProdMode }      from '@angular/core';
    import { BrowserModule } from '@angular/platform-browser';
    import { AppComponent } from './app.component';
    import { FormsModule, ReactiveFormsModule } from '@angular/forms';
    import { Ng2Bs3ModalModule } from 'ng2-bs3-modal/ng2-bs3-modal';
    import { QueuesModule }     from './modules/queues/queues.module';
    import { OrderModule }     from './modules/order/order.module';
    import { AccountModule } from './modules/account/account.module';
    import { AdminModule } from './modules/admin/admin.module';
    import { routing } from './app.routing';
    import { GridModule } from '@progress/kendo-angular-grid';
    import { SplashComponent } from './modules/splash/splash.component';
    import { ContactComponent } from './modules/footer/contact/contact.component';
    
    import { SharedModule } from './shared/shared.module';
    import { EmailValidator } from './shared/utilities/custom-validators'
    
    import { CookieService } from 'angular2-cookie/services/cookies.service';
    import { HttpModule, Response } from '@angular/http';
    import { StringService } from './services/string.service';
    import { ApiService } from './services/api.service';
    import { UserService } from './services/user.service';
    import { OrderService } from './services/order.service';
    import { OrderGuard } from './services/order-guard.service';
    import { FooterComponent } from './modules/footer/footer.component';
    import { ErrorComponent } from './modules/error/error.component';
    import { CustomFormsModule } from "ng2-validation";
    
    @NgModule({
        imports: [
            BrowserModule,
            FormsModule,
            ReactiveFormsModule,
            HttpModule,
            QueuesModule,
            OrderModule,
            AccountModule,
            AdminModule,
            routing,
            GridModule,
            SharedModule,
            Ng2Bs3ModalModule,
            CustomFormsModule
        ],
        declarations: [
            AppComponent,
            SplashComponent,
            FooterComponent,
            ErrorComponent,
            ContactComponent
        ],
        providers: [
            StringService,
            ApiService,
            UserService,
            CookieService,
            OrderService,
            OrderGuard
        ],
        bootstrap: [AppComponent],
        exports: [
        ]
    })
    
    export class AppModule {
    }
    
  • 共有3个答案

    司雅畅
    2023-03-14

    已经有一段时间了,但对我来说,问题是将formGroup传递给模板,而不是直接引用它。

    例如,这不起作用

    <ng-template #selectField
                 let-field
                 let-group
                 let-frmName="frmName">
        <ng-container [formGroup]="group">
            <mat-form-field fxFlex="32"
                            floatLabel="always">
                <mat-label>{{field.label}}</mat-label>
                <mat-select [formControlName]="frmName"
                            [required]="field.required">
                    <mat-option *ngFor="let option of field.options"
                                [value]="option.value">
                        {{option.description}}
                    </mat-option>
                </mat-select>
            </mat-form-field>
        </ng-container>
    </ng-template>
    

    如果我直接使用我的formGroup实例,它就可以正常工作。

    希望这能有所帮助。

    华阳秋
    2023-03-14

    当您错误地将< code>formGroup= " ... "添加到您的模板时而不是< code>[formGroup]= " ... "您也会收到此错误消息。

    车胤运
    2023-03-14

    绑定模板变量< code>#contactForm似乎会导致名称冲突,并破坏模板处理器,因为它试图将附加的模板变量转换为后端的< code>NgForm。在我见过的所有使用模型驱动表单的地方,表单上都没有绑定模板变量,而在模板驱动表单中使用了< code>#tv="ngForm"。这两种形式的混合方法似乎存在失误,导致了错误。

    只需删除它即可解决问题。

     类似资料:
    • 问题内容: 当我试图在React版本15.2.0中使用这两个函数时,我在代码中发现了一个问题,尽管如此,我找到了一种解决方法,但是我想知道是否有更好的解决方案。 因此,每当我尝试运行index.html文件时,都不会显示任何内容,但是控制台会出现第一个错误: React.render不是function 。我发现发生这种情况是因为新版本的React需要使用react-dom,即 现在问题已解决,但

    • 问题内容: 我正在为无法解决的错误而烦恼。我有以下内容; JSON格式 和下面的jQuery 但是我收到一个错误,认为map.data未定义为函数?看着它,我不知道什么是行不通的,因为我已将其从以前使用的代码复制到新项目中。唯一不同的是JSON源。上一个没有[]括号之前的部分。这是什么让我失望吗? 问题答案: 对象,在JavaScript没有方法,它只是为数组,。 因此,为了使您的代码正常工作,请

    • 问题内容: 我有这段代码可用于从Arduino接收数据,但我想将数据发送回Arduino并在客户端页面上获得响应。我添加了侦听功能,但是从客户端页面发送数据时却不断获取信息。 test.js 问题答案: 您的价值不是应有的价值。 通常的做事方式是这样的: 但是我猜你的价值是这样的: 那不是同一回事。那就是模块句柄。但是,当您这样做时: 然后,是一个socket.io实例。您可以将侦听器绑定到实例,

    • 问题内容: 我正在尝试使用来运行任何按钮的功能。我在Firebug中遇到错误 document.getElementByClass不是函数 这是我的代码: 问题答案: 您可能是想(然后从结果节点列表中获取第一项): 您可能仍然会收到错误 不是功能 但是,在较旧的浏览器中,如果需要支持那些较旧的浏览器,则可以提供后备实现。

    • 编辑:阅读问题末尾的部分! 我的服务代码: 在我的组件中,我有这个提交功能: 这里和这里都有类似的错误。答案总是包含rxjs函数,但是我这样做了,所以我不太确定,为什么会出现这个错误。 编辑: 因此,实际的问题不是这个函数,而是主应用程序中我的路线前缺少“/”。js文件。解决了这个问题之后,问题就消失了。

    • 问题内容: 我有以下组件,该组件维护在特定元素上触发事件时更新的状态,并且在更新状态时将其作为道具传递给另一个组件。我目前正在尝试为什么我得到以下错误“ this.setState不是函数”,它很可能没有绑定到正确的上下文。但是我不确定,我这样做正确吗? 编辑: 我只是意识到上下文会在“onreadyStateChange”函数时发生更改,所以我在searchGif中做了以下操作 问题答案: 您正