#javascript #angular #typescript #angular-reactive-forms #angular2-form-validation
Вопрос:
в приведенном ниже коде я хотел выполнить проверку реактивной формы. поэтому я сослался на некоторые вопросы и учебник, например, на этот:
https://jasonwatmore.com/post/2018/05/10/angular-6-reactive-forms-validation-example
несмотря на то, что я правильно выполнил шаги, однако при запуске приложения я получаю следующие ошибки
NG0301: Export of name 'ngModel' not found!
соответствующий файл спецификации был изменен, как показано ниже, и необходимый импорт добавлен в приложение.module.ts. пожалуйста, ознакомьтесь с кодом и файлами, опубликованными ниже, и дайте мне знать, как исправить эту ошибку
html-код:
<div class="modal-body">
<form [formGroup]="distanceMeasuremrntForm" (ngSubmit)="measureDistanceForCoordinates()" #form="ngForm" class="clr-form clr-form-horizontal" autocomplete="off">
<clr-input-container>
<label >{{ "DISTANCE_MEASUREMENT.START_LONGITUDE" | translate }}:</label>
<input
id="startLngTextId"
required
maxlength="25"
clrInput
type="text"
name="name1"
[(ngModel)]=iMeasureDistanceParametersPasser.startLongitude
#name1="ngModel"
formControlName="startLngControlName"
[ngClass]="{ 'is-invalid': submitted amp;amp; f.startLngControlName.errors }"
/>
<div *ngIf="submitted amp;amp; f.startLngControlName.errors" class="invalid-startLng">
<div *ngIf="f.startLngControlName.errors.required">First Name is required</div>
</div>
</clr-input-container>
<clr-input-container>
<label>{{ "DISTANCE_MEASUREMENT.START_LATITUDE" | translate }}:</label>
<input
id="startLatTextId"
required
maxlength="25"
clrInput
type="text"
name="name2"
[(ngModel)]=iMeasureDistanceParametersPasser.startLatitude
#name2="ngModel"
formControlName="startatControlName"
[ngClass]="{ 'is-invalid': submitted amp;amp; f.startatControlName.errors }"
/>
<div *ngIf="submitted amp;amp; f.startatControlName.errors" class="invalid-startLat">
<div *ngIf="f.startatControlName.errors.required">First Name is required</div>
</div>
</clr-input-container>
<clr-input-container>
<label>{{ "DISTANCE_MEASUREMENT.END_LONGITUDE" | translate }}:</label>
<input
id="endLngTextId"
required
maxlength="25"
clrInput
type="text"
name="name3"
[(ngModel)]=iMeasureDistanceParametersPasser.endLongitude
#name3="ngModel"
formControlName="endLngControlName"
[ngClass]="{ 'is-invalid': submitted amp;amp; f.endLngControlName.errors }"
/>
<div *ngIf="submitted amp;amp; f.endLngControlName.errors" class="invalid-endLng">
<div *ngIf="f.endLngControlName.errors.required">First Name is required</div>
</div>
</clr-input-container>
<clr-input-container>
<label>{{ "DISTANCE_MEASUREMENT.END_LATITUDE" | translate }}:</label>
<input
id="endLatTextId"
required
maxlength="25"
clrInput
type="text"
name="name4"
[(ngModel)]=iMeasureDistanceParametersPasser.endLatitude
#name4="ngModel"
formControlName="endLatControlName"
[ngClass]="{ 'is-invalid': submitted amp;amp; f.endLatControlName.errors }"
/>
<div *ngIf="submitted amp;amp; f.endLatControlName.errors" class="invalid-endLat">
<div *ngIf="f.endLatControlName.errors.required">First Name is required</div>
</div>
</clr-input-container>
<div>
<button
class="btn btn-primary"
type="button"
>
{{ "DISTANCE_MEASUREMENT.ENTRY_LABEL" | translate }}
</button>
</div>
<div>
<button
class="btn btn-primary"
type="button"
(click)="clearInputs()"
>
{{ "COMMON.CLEAR_DATA" | translate }}
</button>
</div>
<div>
<label *ngIf=showMeasuredDistance>
{{ "DISTANCE_MEASUREMENT.DISTANCE" | translate }}
{{ "DISTANCE_MEASUREMENT.EQUAL" | translate }}
{{ mMeasuredDistanceInKM }}
{{ "DISTANCE_MEASUREMENT.UNIT_KM" | translate }}
</label>
</div>
</form>
<div class="modal-footer">
<button
class="btn btn-outline"
type="button"
(click)="hideWindowOverlay()"
>
{{ "COMMON.CANCEL" | translate }}
</button>
</div>
</div>
файл спецификации:
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { FormsModule } from '@angular/forms';
import { DistanceMeasurmentParametersComponent } from './distance-measurment-parameters.component';
describe('DistanceMeasurmentParametersComponent', () => {
let component: DistanceMeasurmentParametersComponent;
let fixture: ComponentFixture<DistanceMeasurmentParametersComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
imports:[FormsModule],
declarations: [ DistanceMeasurmentParametersComponent ]
})
.compileComponents();
});
beforeEach(() => {
fixture = TestBed.createComponent(DistanceMeasurmentParametersComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
модуль приложения
import { BrowserModule } from "@angular/platform-browser";
import { NgModule } from "@angular/core";
import { AppComponent } from "./app.component";
@NgModule({
declarations: [
...
...
],
imports: [
BrowserModule,
HotTableModule.forRoot(),
FormsModule,//<-impored
.....,
.....,
ReactiveFormsModule,
TranslateModule.forRoot({
loader: {
provide: TranslateLoader,
useFactory: HttpLoaderFactory,
deps: [HttpClient]
}
})
],
providers: [
{
provide: LocationStrategy,
useClass: HashLocationStrategy
},
{
provide: HTTP_INTERCEPTORS,
useClass: TokenInterceptor,
multi: true
},
{
provide: HTTP_INTERCEPTORS,
useClass: LoadingScreenInterceptor,
multi: true
}
],
bootstrap: [AppComponent]
})
export class AppModule {}
// AoT requires an exported function for factories
export function HttpLoaderFactory(http: HttpClient) {
return new TranslateHttpLoader(http, './assets/i18n/', '.json');// für http://192.168.211.39/synops-2
//return new TranslateHttpLoader(http);
}
Комментарии:
1. Здравствуйте @amrmbso01, в каком модуле вы используете форму? в AppModule?
2. @kplus не могли бы вы, пожалуйста, перефразировать свой комментарий, потому что я не мог понять, что вы имеете в виду
3. в вашем проекте у вас есть модули, базовым модулем которых является модуль приложения. В каком из модулей вы используете форму/NgModule
4. @kplus извините, все еще не смог его получить