Невозможно привязать к formGroup, так как это не известное свойство form

182

СИТУАЦИЯ:

Пожалуйста, помогите! Я пытаюсь сделать то, что должно быть очень простой формой в моем приложении Angular2, но независимо от того, что он никогда не работает.

ANGULAR ВЕРСИЯ:

ANGULAR 2.0.0 Rc5

ОШИБКА:

Can't bind to 'formGroup' since it isn't a known property of 'form'

Изображение 220

КОД:

Вид:

<form [formGroup]="newTaskForm" (submit)="createNewTask()">

    <div class="form-group">
        <label for="name">Name</label>
        <input type="text" name="name" required>
    </div>

     <button type="submit" class="btn btn-default">Submit</button>

</form>

Контроллер:

import { Component } from '@angular/core';
import { FormGroup, FormControl, Validators, FormBuilder }  from '@angular/forms';
import {FormsModule,ReactiveFormsModule} from '@angular/forms';
import { Task } from './task';

@Component({
    selector: 'task-add',
    templateUrl: 'app/task-add.component.html'

})


export class TaskAddComponent {

    newTaskForm: FormGroup;

    constructor(fb: FormBuilder) 
    {
        this.newTaskForm = fb.group({
            name: ["", Validators.required]
        });
    }

    createNewTask()
    {
        console.log(this.newTaskForm.value)
    }

}

ngModule:

import { NgModule }      from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule }   from '@angular/forms';

import { routing }        from './app.routing';
import { AppComponent }  from './app.component';
import { TaskService } from './task.service'


@NgModule({
    imports: [ 
        BrowserModule,
        routing,
        FormsModule
    ],
    declarations: [ AppComponent ],
    providers: [
        TaskService
    ],
    bootstrap: [ AppComponent ]
})


export class AppModule { }

ВОПРОС:

Почему я получаю эту ошибку?

Я что-то пропустил?

Теги:
angular
angular2-forms

10 ответов

407
Лучший ответ

RC5 FIX

Вам нужно import { REACTIVE_FORM_DIRECTIVES } from '@angular/forms' в вашем контроллере и добавить его в directives в @Component. Это устранит проблему.

После того, как вы исправите это, вы, вероятно, получите еще одну ошибку, потому что вы не добавили formControlName="name" к вашему вводу в форме.

RC6/RC7/Final release FIX

Чтобы исправить эту ошибку, вам просто нужно импортировать ReactiveFormsModule из @angular/forms в свой модуль. Вот пример базового модуля с ReactiveFormsModule import:

import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { AppComponent }  from './app.component';

@NgModule({
    imports: [
        BrowserModule,
        FormsModule,
        ReactiveFormsModule
    ],
    declarations: [
        AppComponent
    ],
    bootstrap: [AppComponent]
})

export class AppModule { }

Далее, formGroup является селектором директивы с именем FormGroupDirective, который является частью ReactiveFormsModule, поэтому необходимо импортировать его. Он используется для привязки существующего formGroup к элементу DOM. Подробнее об этом можно узнать на странице Angular официальных документов.

  • 9
    Чего я не понимаю, так это того, почему нужно добавить REACTIVE_FORM_DIRECTIVES, если FormsModule импортируется в app.module. Весь смысл модулей в том, чтобы избежать необходимости объявлять директивы внутри компонентов.
  • 13
    @DanielPliscki Вы совершенно правы, я только что узнал, что они исправили эту проблему в версии RC6, которая была выпущена сегодня. Теперь вам не нужно этого делать, вам нужно только импортировать FormsModule и ReactiveFormsModule . Я отредактирую свой ответ.
Показать ещё 9 комментариев
43

Angular 4 в сочетании с функциональными модулями (если вы используете, например, совместно используемый модуль), необходимо также экспортировать ReactiveFormsModule для работы.

import { NgModule }                                 from '@angular/core';
import { CommonModule }                             from '@angular/common';
import { FormsModule, ReactiveFormsModule }         from '@angular/forms';

@NgModule({
  imports:      [
    CommonModule,
    ReactiveFormsModule
  ],
  declarations: [],
  exports: [
    CommonModule,
    FormsModule,
    ReactiveFormsModule
  ]
})
export class SharedModule { } 
  • 0
    работает очень хорошо!
6

Хорошо после некоторого рытья я нашел решение для "Не могу привязываться к" formGroup ", так как это не известное свойство" формы "."

В моем случае я использовал несколько файлов модулей, я добавил ReactiveFormsModule в app.module.ts

 import { FormsModule, ReactiveFormsModule } from '@angular/forms';`

@NgModule({
  declarations: [
    AppComponent,
  ]
  imports: [
    FormsModule,
    ReactiveFormsModule,
    AuthorModule,
],
...

Но это не сработало, когда я использую директиву [formGroup] из компонента, добавленного в другом модуле, например. используя [formGroup] в author.component.ts, подписанный в файле author.module.ts:

import { NgModule }       from '@angular/core';
import { CommonModule }   from '@angular/common';
import { AuthorComponent } from './author.component';

@NgModule({
  imports: [
    CommonModule,
  ],
  declarations: [
    AuthorComponent,
  ],
  providers: [...]
})

export class AuthorModule {}

Я думал, что если бы я добавил ReactiveFormsModule в app.module.ts, по умолчанию ReactiveFormsModule наследуется всеми его дочерними модулями, такими как author.module, в этом случае... (неправильно!). Мне нужно было импортировать ReactiveFormsModule в author.module.ts, чтобы заставить все директивы работать:

...
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
...

@NgModule({
  imports: [
    ...,
    FormsModule,    //added here too
    ReactiveFormsModule //added here too
  ],
  declarations: [...],
  providers: [...]
})

export class AuthorModule {}

Итак, если вы используете подмодули, обязательно импортируйте ReactiveFormsModule в каждый файл подмодуля. Надеюсь, это поможет любому.

  • 1
    Спасибо за предоставление истории также. Это именно то, что я потратил впустую свое время на 2 дня сейчас ...
  • 0
    Работает для меня, точно такая же проблема, я действительно думал, что модули в массиве экспорта будут наследоваться дочерними модулями ... Не знаю, почему именно! РЕДАКТИРОВАТЬ: документация говорит, что экспорт должен сделать компоненты, трубы, директивы доступными в ШАБЛОНЕ любого КОМПОНЕНТА ()
Показать ещё 1 комментарий
6

Предлагаемый ответ не работал у меня с Angular 4. Вместо этого мне пришлось использовать другой способ привязки атрибута с помощью attr префикс:

<element [attr.attribute-to-bind]="someValue">
  • 2
    Эй, чувак! Вы уверены, что ваш ответ связан с вопросом? :) Вопрос был о проблеме с настройкой формы - причина в неправильной настройке ngModule
  • 0
    @johnnyfittizio Довольно уверен. Тот же сценарий, то же сообщение об ошибке.
Показать ещё 4 комментария
5

Если у вас есть два модуля, добавьте их так:

import {ReactiveFormsModule,FormsModule} from '@angular/forms';
@NgModule({
  declarations: [
    AppComponent,
    HomeComponentComponent,
    BlogComponentComponent,
    ContactComponentComponent,
    HeaderComponentComponent,
    FooterComponentComponent,
    RegisterComponent,
    LoginComponent
  ],
  imports: [
    BrowserModule,
    FormsModule,
    HttpModule,
    routes,
    ReactiveFormsModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
3

Имейте в виду, что если вы определили "Модули функций", вам нужно будет импортировать в функциональный модуль, даже если вы уже импортировали в AppModule. Из документации Angular:

Модули не наследуют доступ к компонентам, директивам или каналам, объявленным в других модулях. Импорт AppModule не имеет отношения к ContactModule и наоборот. Прежде чем ContactComponent может связываться с [(ngModel)], его ContactModule должен импортировать FormsModule.

https://angular.io/docs/ts/latest/guide/ngmodule.html

2

Для людей, прогуливающих эти потоки об этой ошибке. В моем случае у меня был общий модуль, в котором я экспортировал только FormsModule и ReactiveFormsModule и забыл его импортировать. Это вызвало странную ошибку, что formgroups не работали в подкомпонентах. Надеюсь, это поможет людям почесывать головы.

0

Я столкнулся с этой ошибкой во время модульного тестирования компонента (только во время тестирования, в приложении он работал нормально). Решение состоит в том, чтобы импортировать файл ReactiveFormsModule в .spec.ts:

// Import module
import { ReactiveFormsModule } from '@angular/forms';

describe('MyComponent', () => {
    beforeEach(async(() => {
        TestBed.configureTestingModule({
            declarations: [MyComponent],
            imports: [ReactiveFormsModule],  // Also add it to 'imports' array
        })
        .compileComponents();
    }));
});
  • 0
    Именно проблема, с которой я столкнулся. Это решение сработало отлично!
0

Я сталкивался с этой ошибкой при попытке тестирования e2e, и это сводило меня с ума, что на это не было ответов.

ЕСЛИ ВЫ ИДЕТЕ ИСПЫТАНИЕ, найдите свой файл *.specs.ts и добавьте:

import {ReactiveFormsModule, FormsModule} from '@angular/forms';
-2

Я только что сделал [formsGroup], с s после form, поэтому фол...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню