Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

263
Vistas
Dividir un formulario en múltiples componentes con validación

Quiero crear un solo formulario grande con angular 2. Pero quiero crear este formulario con múltiples componentes como muestra el siguiente ejemplo.

componente de la aplicación

 <form novalidate #form1="ngForm" [formGroup]="myForm"> <div> <address></address> </div> <div> <input type="text" ngModel required/> </div> <input type="submit" [disabled]="!form1.form.valid" > </form>

Componente de dirección

 <div> <input type="text" ngModel required/> </div>

Cuando uso el código anterior, estaba visible en el navegador cuando lo necesitaba, pero el botón Enviar no estaba deshabilitado cuando eliminé el texto en el componente de dirección.
Pero el botón se deshabilitó correctamente cuando eliminé el texto en el cuadro de entrada en el componente de la aplicación.

about 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Usaría una forma reactiva que funciona bastante bien, y en cuanto a su comentario:

¿Hay algún otro ejemplo simple para este? Tal vez el mismo ejemplo sin bucles.

Te puedo dar un ejemplo. Todo lo que necesita hacer es anidar un FormGroup y pasárselo al niño.

Digamos que su formulario se ve así y desea pasar el grupo de formularios de address al niño:

 ngOnInit() { this.myForm = this.fb.group({ name: [''], address: this.fb.group({ // create nested formgroup to pass to child street: [''], zip: [''] }) }) }

Luego, en su padre, simplemente pase el grupo de formulario anidado:

 <address [address]="myForm.get('address')"></address>

En su hijo, use @Input para el grupo de formulario anidado:

 @Input() address: FormGroup;

Y en su plantilla use [formGroup] :

 <div [formGroup]="address"> <input formControlName="street"> <input formControlName="zip"> </div>

Si no desea crear un grupo de formularios anidado real, no necesita hacerlo, simplemente puede pasar el formulario principal al secundario, por lo que si su formulario se ve así:

 this.myForm = this.fb.group({ name: [''], street: [''], zip: [''] })

puedes pasar los controles que quieras. Usando el mismo ejemplo anterior, solo nos gustaría mostrar street y zip , el componente secundario permanece igual, pero la etiqueta secundaria en la plantilla se vería así:

 <address [address]="myForm"></address>

Aquí está un

Demo de la primera opción, aquí está la segunda Demo

Más información aquí sobre formularios basados en modelos anidados.

about 4 years ago · Santiago Trujillo Denunciar

0

También hay una manera de hacerlo en formularios controlados por plantillas. ngModel crea automáticamente un formulario separado en cada componente, pero puede inyectar el formulario del componente principal agregando esto a su componente:

 @Component({ viewProviders: [{ provide: ControlContainer, useExisting: NgForm}] }) export class ChildComponent

Sin embargo, debe asegurarse de que cada entrada tenga un nombre único. Entonces, si usa * ngFor para llamar a su componente secundario, debe colocar el índice (o cualquier otro identificador único) en el nombre, por ejemplo:

 [name]="'address_' + i"

Si desea estructurar su formulario en FormGroups, use ngModelGroup y

 viewProviders: [{ provide: ControlContainer, useExisting: NgModelGroup }]

en lugar de ngForm y agregue [ngModelGroup]="yourNameHere" a algunos de sus componentes secundarios html que contienen etiquetas.

about 4 years ago · Santiago Trujillo Denunciar

0

Desde mi experiencia, este tipo de composición de campos de formulario es difícil de hacer con formularios basados en plantillas. Los campos incrustados en su componente de dirección no se registran en el formulario (objeto NgForm.controls), por lo que no se consideran al validar el formulario.

  • Puede crear un componente ControlValueAccessor (que acepta el atributo ngModel) con todas las validaciones, pero luego es difícil mostrar errores de validación y propagar cambios (la dirección se considera como un campo de formulario único con un valor complejo).
  • Probablemente podría pasar la referencia del formulario al componente Dirección y registrar sus controles internos en él, pero no lo he intentado y parece ser un enfoque extraño (no lo he visto en ninguna parte).
  • Puede cambiar a formularios reactivos (en lugar de plantillas), pasar un objeto de grupo de formulario (que representa una dirección) al componente Dirección, manteniendo la validación en la definición de su formulario. Puede ver un ejemplo aquí https://scotch.io/tutorials/how-to-build-nested-model-driven-forms-in-angular-2
about 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda