Добавление динамического из полей, которое изменяет поля, сортировку и проверку во время выполнения
Меня попросили сделать регистрацию пользователя для веб-сайта "X". Администратор этого веб-сайта X хочет управлять этим из поля и выполнять следующие операции:
- Добавление полей и проверка.
- Сортировка полей.
когда конечный пользователь откроет страницу регистрации, поля изменяются по мере изменения администратором
это выполнимо с угловым 6?? если да, пожалуйста, дайте мне что-нибудь для начала.
1 ответ
Я создал пример приложения на Stackblitz для проверки динамических полей формы во время выполнения.
Позвольте мне подробно описать, что я сделал для достижения этой цели:
Шаг 1: Разработанный Admin настроил данные JSON.
Для вашего лучшего понимания я добавил два поля формы в JSON с динамической проверкой.
Поле одно (userName): это поле требует динамической проверки с сообщением об ошибке, настроенным сервером, alpha, maxLength и minLength.
Поле два (пароль): для этого поля требуются динамические проверки и проверка пароля, например, 1 специальный символ, минимальная длина 5, максимальная длина 10 и одно числовое значение.
Вот структура JSON:
[{
"fieldId":1,
"label":"Username",
"placeHolder":"Enter your username",
"value":"",
"sortId":1,
"validation":{
"value":{
"alpha":true,
"required":{"message":"This field is required."},
"minLength":{"value":5},
"maxLength":{"value":10}
}
}
},{
"fieldId":2,
"label":"Password",
"placeHolder":"Enter your password",
"value":"",
"sortId":2,
"validation":{
"value":{
"required":true,
"password":{ "validation":{
"maxLength": 10,"minLength": 5,"digit": true,"specialCharacter": true
}
}
}
}
}
]
Шаг 2. Выполните сервисный вызов и получите данные поля формы.
Для генерации FormGroup с динамической проверкой я использовал RxFormBuilder, он является частью пакета " @ rxweb / реактивный-форма-валидаторы ". Это создает объект Angular FormGroup с динамической проверкой на соответствующем элементе управления формы.
Вот Генерация кода FormGroup:
dynamicFormGroup: FormGroup;
formFields:any[];
constructor(
private formBuilder: RxFormBuilder, private http: HttpClient
) { }
ngOnInit(){
this.http.get('assets/questions.json').subscribe((formFields:any[]) => {
this.formFields = formFields;
this.dynamicFormGroup = this.formBuilder.group({
"questions":formFields
},{
includeProps:['questions','questions.value'],
dynamicValidationConfigurationPropertyName:'validation'
});
})
}
Шаг 3: Привязать HTML в соответствии со стандартной практикой. Вот HTML-код:
<div [formGroup]="dynamicFormGroup.controls.questions.controls[index]" *ngFor="let row of formFields;let index = index" class="form-group">
<label>{{row.label}}</label>
<input type="text" formControlName="value" class="form-control" />
{{dynamicFormGroup.controls.questions.controls[index].controls.value.errors | json}}
</div>
Почему я использовал @ rxweb / реактивные-формы-валидаторы?
То же самое может быть возможно при стандартном подходе Angular без использования сторонней библиотеки, такой как @ rxweb / реактивные-формы-валидаторы, но мне нужно написать слишком много кода в компоненте, а также мне нужно создать множество пользовательских валидаторов и применить FormControl на основе данных сервера.
Несколько основных вещей, чтобы выбрать этот подход:
Мне не нужно создавать FormArray, FormGroup и FormControl на основе данных JSON. RxFormBuilder автоматически создает все три вещи на основе предоставленных данных сервера.
Мне не нужно писать условие if/else для привязки валидаторов в соответствующем FormControl. С @ rxweb / реактивные-формы-валидаторы автоматически управляются на основе правил проверки вашего сервера.
@ rxweb / реактивный-форма-валидаторы предоставляет более 50 динамических валидаторов. Пожалуйста, проверьте http://rxweb.io/
Код будет намного чище, чем стандартный угловой подход.
Вы можете изменить структуру JSON и HTML в соответствии с потребностями вашего приложения. Пожалуйста, дайте мне знать, если у вас есть какие-либо вопросы.
Шаги, которые я выполнил, чтобы заставить его работать с @ rxweb / реактивной формой-валидаторами:
- npm install @ rxweb / реактивная форма-валидаторы
- импортировать 'RxReactiveFormsModule' в корневой модуль.
- разрешить службу 'RxFormBuilder' в компоненте и использовать групповой метод для создания FormGroup.