'Form'un bilinen bir özelliği olmadığı için' formGroup 'a bağlanamıyor


806

DURUM:

Lütfen yardım et! Angular2 uygulamamda çok basit bir form olması gerekeni yapmaya çalışıyorum ama ne işe yaramıyor olursa olsun.

AÇILI VERSİYON:

Açısal 2.0.0 Rc5

HATA:

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

resim açıklamasını buraya girin

KOD:

Görünüm:

<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>

Kontrol eden, denetleyici:

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 { }

SORU:

Neden bu hatayı alıyorum?

Bir şey mi kaçırıyorum?

Yanıtlar:


1412

RC5 DÜZELTME

Sen gerek import { REACTIVE_FORM_DIRECTIVES } from '@angular/forms'controller içerisinde ve eklemek directivesiçinde @Component. Bu sorunu çözecektir.

Bunu düzelttikten sonra formControlName="name", formunuza girdinizi eklemediğiniz için muhtemelen başka bir hata alırsınız .

RC6 / RC7 / Son sürüm FIX

Bu hatayı düzeltmek için, sadece ithalat gerek ReactiveFormsModuledan @angular/formssizin modülünde. Aşağıda, ReactiveFormsModuleiçe aktarma içeren temel bir modül örneği verilmiştir :

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 { }

Daha fazla açıklamak gerekirse , bir parçası olan formGroupdirektif için bir seçici , dolayısıyla onu içe aktarma ihtiyacı. Mevcut bir DOM öğesine bağlamak için kullanılır . Bununla ilgili daha fazla bilgiyi Angular'ın resmi dokümanlar sayfasında bulabilirsiniz .FormGroupDirectiveReactiveFormsModuleFormGroup


13
Ne alamadım FormsModule app.module içine ithal ediliyorsa neden REACTIVE_FORM_DIRECTIVES eklemek gerekir. Modüllerin tamamı, bileşenler içindeki direktifleri bildirmekten kaçınmaktır.
Daniel Pliscki

19
@DanielPliscki Tamamen haklısın, sadece bugün yayınlanan RC6 sürümünde bu sorunu çözdüklerini öğrendim. Şimdi bunu yapmanız gerekmiyor, sadece içe aktarmanız FormsModuleve ReactiveFormsModule. Cevabımı düzenleyeceğim.
Stefan Svrkota

12
Devletler arasında modüller ile tembel yük sağlamak için giriş formum için ayrı bir modül oluşturduğumu unutarak bir SAAT KAYDI. (A2'de yeniyim, yine de A1'i tercih ediyorum) Lütfen doğru modülü kullandığınızdan emin olun! Benim gibi bir serseri olma. Artık bileşene eklemeniz de gerekmiyor. Modülünüzdeki ithalat yeterli. Teşekkürler
user1889992 18:17

4
Teşekkürler, benim için çalıştı. Bunun neden tökezlediğim Açısal 2 FormControls kılavuzlarında belirtilmediğini kafam karıştı ..
cjohansson

1
Açısal 4'te ReactiveFormsModulesağlayıcı listesine ekledim ve işe yaradı. Yine de bunu yapmak için gereken yolu olup olmadığından emin değilim.
BrunoLM

151

Açısal 4, özellik modülleriyle birlikte (örneğin bir paylaşılan modül kullanıyorsanız), ReactiveFormsModuleçalışmak için dışa aktarmanızı gerektirir .

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 { } 

122

Tamam bazı kazma sonra "formGroup" için bağlanamıyorum çünkü 'form' bilinen bir özelliği olmadığı için bir çözüm buldum.

Benim durumum için, birden fazla modül dosyası kullanıyorum, app.module.ts dosyasına ReactiveFormsModule ekledim

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

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

Ancak başka bir modüle eklenen bir bileşenden [formGroup] yönergesini kullandığımda, örneğin author.module.ts dosyasında abone olan author.component.ts dosyasında [formGroup] kullanarak bu çalışma değildi:

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

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

export class AuthorModule {}

Ben app.module.ts içinde ReactiveFormsModule ekledi, varsayılan olarak ReactiveFormsModule bu durumda author.module gibi tüm çocuk modülleri tarafından miras olacağını düşündüm ... (yanlış!). Tüm direktiflerin çalışması için ReactiveFormsModule'u author.module.ts dosyasına aktarmam gerekiyordu:

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

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

export class AuthorModule {}

Bu nedenle, alt modül kullanıyorsanız, her alt modül dosyasında ReactiveFormsModule dosyasını aldığınızdan emin olun. Umarım bu herkese yardımcı olur.


1
Benim için çalışıyor, tam olarak aynı sorun, gerçekten ihracat dizisindeki modüllerin çocuk modülleri tarafından miras alınacağını düşündüm ... Neden tam olarak bilmiyorum! DÜZENLEME: belgeler ihracat herhangi bir
BİLEŞEN'in

52

Bir bileşenin birim sınaması sırasında bu hatayla karşılaştım (yalnızca sınama sırasında, normal olarak çalışan uygulama içinde). Çözelti ithalat etmektir ReactiveFormsModuleiçinde .spec.tsdosyanın:

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

describe('MyComponent', () => {
    beforeEach(async(() => {
        TestBed.configureTestingModule({
            declarations: [MyComponent],
            imports: [ReactiveFormsModule],  // Also add it to 'imports' array
        })
        .compileComponents();
    }));
});

24

Önerilen cevap Köşeli 4 ile benim için işe yaramadı. Bunun yerine , önek ile başka bir nitelik bağlama yöntemi kullanmak zorunda kaldım attr:

<element [attr.attribute-to-bind]="someValue">

3
Hey dostum! Cevabınızın soru ile ilgili olduğundan emin misiniz? :) Soru, bir formun ayarlanmasıyla ilgili bir sorundu - neden ngModule
FrancescoMussi'nin

1
@johnnyfittizio Kesinlikle eminim. Aynı senaryo, aynı hata mesajı.
str

2
Bu benim için çalıştı, ama garip - neden ihtiyacım var attr.?
CodyBugstein

Bir ton teşekkürler. Bu da benim için çalıştı, ama kütüphane sürümleme veya <form> etiket konumlandırma gibi sorunu tetikleyen başka bir şey olmalı düşünürdüm? Garip.
Memetican

Buldum - sorun ReactiveFormsModuledoğrudan benim sayfanın içine almak gerekiyordu .module.ts. Değil .page.ts... Bunu yaptığımda, şablonum önek formGroupolmadan niteliği doğru bir şekilde tanımlayabiliyordu attr..
Memetican

19

İki modülü içe aktarmanız gerekiyorsa, aşağıdaki gibi ekleyin

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]
})

14

"Özellik Modülleri" tanımladıysanız, daha önce içeri aktarmış olsanız bile Özellik Modülüne aktarmanız gerektiğini unutmayın AppModule. Açısal belgelerden:

Modüller, diğer modüllerde bildirilen bileşenlere, yönergelere veya borulara erişimi devralmaz. AppModule'un içe aktardığı şey, ContactModule ile alakasız veya tam tersi. ContactComponent'in [(ngModel)] ile bağlanabilmesi için, ContactModule öğesinin FormsModule dosyasını içe aktarması gerekir.

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


14

Hata, FormGroup'un bu modülde tanınmadığını söylüyor. Bu nedenle, bu (aşağıda) modülleri FormGroup kullanan her modülde içe aktarmanız gerekir

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

Ardından Modülünüzün import dizisine FormsModule ve ReactiveFormsModule ekleyin .

imports: [
  FormsModule,
  ReactiveFormsModule
],

AppModule'a zaten eklediğimi düşünüyor olabilirsiniz ve onu miras almalı? Ama öyle değil. çünkü bu modüller sadece içe aktarma modüllerinde bulunan gerekli direktifleri dışa aktarmaktadır. Buradan daha fazlasını okuyun ... https://angular.io/guide/sharing-ngmodules .

Bu hataların diğer faktörleri aşağıdaki gibi büyü hatası olabilir ...

[FormGroup] = "form" Sermaye F yerine küçük f

[formsGroup] = "form" Ekstra s formunda sonra


13

Açısal 7 ile aynı sorunu yaşadım. Sadece app.module.ts dosyanızda içe aktarın.

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

Sonra ithalat dizinize FormsModule ve ReactiveFormsModule ekleyin.

imports: [
  FormsModule,
  ReactiveFormsModule
],

1
Bu benim için Angulat 7'de işe yaramıyor
RaffAl

9

Bu sorun, FormsModule, ReactiveFormsModule.I eksik eksik nedeniyle oluşur. Ben de aynı sorunla birlikte geldi. Benim durumum farklıydı. Bu yüzden alt modüllere aktarmış olsam da üst modüllerimdeki ithalatları kaçırdım, çalışmadı.

Sonra aşağıdaki gibi ana modüller içine ithal ve işe yaradı!

import { ReactiveFormsModule,FormsModule  } from '@angular/forms';
import { AlertModule } from 'ngx-bootstrap';

         @NgModule({
          imports: [
            CommonModule,
            FormsModule,
            ReactiveFormsModule,
    ],
      declarations: [MyComponent]
    })

7

Bu konu hakkında bu konuları dolaşan insanlar için. Benim durumumda, sadece FormsModule ve ReactiveFormsModule'u ihraç ettiğim ve içe aktarmayı unuttuğum paylaşılan bir modülüm vardı. Bu, form gruplarının alt bileşenlerde çalışmadığı garip bir hataya neden oldu. Umarım bu insanlar kafalarını kaşıyor.


7

E2e testi yapmaya çalışırken bu hatayla karşılaşıyordum ve buna cevap vermem beni deli ediyordu.

TEST YAPIYORSANIZ * .specs.ts dosyanızı bulun ve ekleyin:

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

5

BİRAZ NOT: Yükleyicilere dikkat edin ve en aza indirin (Rails env.):

Bu hatayı gördükten ve orada her çözümü denedikten sonra, html yükleyicimle ilgili bir sorun olduğunu anladım.

Rails ortamımı, bu yükleyici ( config/loaders/html.js.) ile bileşenlerim için HTML yollarını başarıyla içe aktaracak şekilde ayarladım :

module.exports = {
  test: /\.html$/,
  use: [ {
    loader: 'html-loader?exportAsEs6Default',
    options: {
      minimize: true
    }
  }]
}

Birkaç saat çabaları ve ReactiveFormsModule ithalatının sayısız sonra ben benim gördük formGroupküçük harfler vardı: formgroup.

Bu beni yükleyiciye yönlendirdi ve HTML'mi en aza indirdi.

Seçenekleri değiştirdikten sonra, her şey olması gerektiği gibi çalıştı ve tekrar ağlamaya geri dönebilirim.

Bu sorunun bir cevabı olmadığını biliyorum, ama gelecekteki Rails ziyaretçileri (ve özel yükleyiciler ile diğer) için bu yararlı olabilir düşünüyorum.


5

REACTIVE_FORM_DIRECTIVES kullanarak ve içe aktarın :

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 { }

5

Bir bileşen geliştirirken bu sorunla karşılaşırsanız, bu iki modülü en yakın modülünüze eklemelisiniz:

import { FormsModule, ReactiveFormsModule } from '@angular/forms';
@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
   // other modules
    FormsModule,
    ReactiveFormsModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

Bileşenleriniz için bir test geliştiriyorsanız, bu modülü test dosyanıza şu şekilde eklemelisiniz:

import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { ContactusComponent } from './contactus.component';
import { ReactiveFormsModule } from '@angular/forms';

describe('ContactusComponent', () => {
  let component: ContactusComponent;
  let fixture: ComponentFixture<ContactusComponent>;

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

    })
      .compileComponents();
  }));

  beforeEach(() => {
    fixture = TestBed.createComponent(ContactusComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
  });

  it('should create', () => {
    expect(component).toBeTruthy();
  });
});


5

Basit çözüm:

1. adım: ReactiveFormModule dosyasını içe aktarın

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

2. adım: içe aktarma bölümüne "ReactiveFormsModule" ekleyin

imports: [

    ReactiveFormsModule
  ]

3.Adım: Uygulamayı yeniden başlatın ve Tamamlandı

Misal :

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import {ReactiveFormsModule} from '@angular/forms';
import { EscalationManagementRoutingModule } from './escalation-management-routing.module';
import { EscalationManagementRouteWrapperComponent } from './escalation-management-route-wrapper.component';


@NgModule({
  declarations: [EscalationManagementRouteWrapperComponent],
  imports: [
    CommonModule,
    EscalationManagementRoutingModule,
    ReactiveFormsModule
  ]
})
export class EscalationManagementModule { }

4

ReactiveFormsModule uygulamasını app.module.ts dosyasına aktarın ve kaydedin.

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

@NgModule({
declarations: [
AppComponent,
HighlightDirective,
TestPipeComponent,
ExpoentialStrengthPipe

],
imports: [
BrowserModule,
ReactiveFormsModule
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }

Yazımınızın hem .ts hem de .html dosyasında doğru olduğundan emin olun. xxx.ts

  profileForm = new FormGroup({
  firstName: new FormControl(''),
 lastName: new FormControl('')
 });

xxx.html dosyası-

  <form [formGroup]="profileForm"> 
  <label>
  First Name:
   <input type="text" formControlName = "firstName">
  </label>

  <label>
  Last Name:
   <input type="text" formControlName = "lastName">
   </label>
   </form>

Yanlışlıkla [formGroup] 'a ait [FormGroup] yazdım. Yazımınızı .html dosyasında doğru şekilde kontrol edin. Derleme zamanı hatası atmaz. .Html dosyasında yanlış bir şey varsa.


1
Ben de aynı hatayı yaptım !! çok teşekkürler. html içinde [FormGroup] değil [formGroup] vardı
tony2tones 9:19

Geri dönüşünüz için teşekkür ederiz.
DIBYA RANJAN TRIPATHY

4

Not : alt modülün bileşeni içinde çalışıyorsanız, u üst uygulama kök modülü yerine alt modülde ReactiveFormsModule'u içe aktarmanız yeterlidir


4

Benim gibi aptal olma. Yukarıdaki ile aynı hatayı alıyordu, bu konudaki seçeneklerin HİÇBİRİ işe yaramadı. Sonra FormGroup 'F' büyük harf yaptım fark ettim. Doh!

Onun yerine:

[FormGroup]="form"

Yapmak:

[formGroup]="form"


1
burada aynı sorun
greg

3

bu yalnızca bir daktilo hatasıysa ancak formunuzdaki her şey işe yararsa, IDE'nizi yeniden başlatmanız gerekebilir


3

Eminim kullanarak eğer yapmak aynı problem vardı submodules , (örneğin, sadece app.component.module.ts var ama bunun içinde ReactiveFormsModule ithalat içerdiğini, login.module.ts gibi ayrı bir bileşen böyle olması login .module.ts bunun için işe, ithal. Ben her şey için submodules kullanıyorum çünkü ben bile benim app.component.module ithalat ReactiveFormsModule gerekmez.

login.module.ts:

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

import { IonicModule } from '@ionic/angular';

import { LoginPageRoutingModule } from './login-routing.module';

import { LoginPage } from './login.page';

@NgModule({
  imports: [
    CommonModule,
    FormsModule,
    ReactiveFormsModule,
    IonicModule,
    LoginPageRoutingModule
  ],
  declarations: [LoginPage]
})
export class LoginPageModule {}

3

Birine yardım edebilir:

bir modda (giriş bileşeni) bir formGroup varsa, modun örneklendiği modülde de ReactiveFormsModule'u içe aktarmanız gerekir.


2

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

açısal ( [prop]) kullanarak bir özelliği bağlamaya çalışmanız anlamına gelir, ancak açısal o öğe için bildiği hiçbir şeyi bulamaz (bu durumda form).

bu, doğru modülü kullanmamanız (bir yerde bir içe aktarmanın eksik olması) ve bazen sadece bir yazım hatası olmasına neden olabilir:

[formsGroup]ile ssonraform


0

Benim çözümüm ince ve zaten listelenmiş görmedim.

Belirtilmeyen bir Açısal Malzemeler İletişim Kutusu bileşeninde reaktif formlar kullanıyordum app.module.ts. Ana bileşen bildirildi app.module.tsve iletişim kutusu bileşenini açacaktı, ancak iletişim bileşeni açıkça bildirilmedi app.module.ts.

İletişim kutusunu her açtığımda formun bu hatayı atması dışında normalde iletişim bileşenini kullanırken herhangi bir sorun yaşamadım.

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


0

İlk olarak, açısal versiyonlar> 2 ile ilgili değildir . Sadece app.module.ts dosyanızdaki aşağıdaki sorunları giderin.

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

Sonra ithalat dizinize FormsModule ve ReactiveFormsModule ekleyin.

imports: [
  FormsModule,
  ReactiveFormsModule
],

Not : Bunun ReactiveFormsModuleyerine belirli bir modüle de aktarabilirsinizapp.module.ts


-2

Bir kere modülümü eklediğimde AppModuleher şey iyi çalışmaya başladı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.