Esto me está volviendo loco, estoy bajo el arma y no puedo permitirme pasar otro día entero en esto.
Estoy tratando de establecer manualmente un valor de control ('departamento') dentro del componente, y simplemente no funciona, incluso el nuevo valor registra para consolarse correctamente.
Aquí está la instancia de FormBuilder:
initForm() {
this.form = this.fb.group({
'name': ['', Validators.required],
'dept': ['', Validators.required],
'description': ['', Validators.required],
});
}
Este es el controlador de eventos que recibe el departamento seleccionado:
deptSelected(selected: { id: string; text: string }) {
console.log(selected) // Shows proper selection!
// This is how I am trying to set the value
this.form.controls['dept'].value = selected.id;
}
Ahora, cuando se envía el formulario y cierro la sesión, this.form
el campo sigue en blanco He visto otro uso de ppl updateValue()
pero este es beta.1 y no lo veo como un método válido para llamar al control.
También intenté llamar updateValueAndValidity()
sin éxito :(.
Simplemente lo usaría ngControl="dept"
en el elemento de formulario, como lo estoy haciendo con el resto del formulario, pero es una directiva / componente personalizado.
<ng-select
[data]="dept"
[multiple]="false"
[items]="depts"
(selected)="deptSelected($event)" <!-- This is how the value gets to me -->
[placeholder]="'No Dept Selected'"></ng-select>
fuente
Respuestas:
Actualizado: 19/03/2017
ANTIGUO:
Por ahora nos vemos obligados a hacer un tipo de reparto:
No muy elegante, estoy de acuerdo. Espero que esto se mejore en futuras versiones.
fuente
(<Control>this.form.controls['dept']).setErrors(null)
this.form.get('dept').setValue(selected.id)
:)this.form.controls.dept.setValue(selected.id);
this.form.controls['dept'].setValue(selected.id);
En Angular 2 Final (RC5 +) hay nuevas API para actualizar los valores de los formularios. El
patchValue()
método API admite actualizaciones parciales de formularios, donde solo necesitamos especificar algunos de los campos:También existe el
setValue()
método API que necesita un objeto con todos los campos del formulario. Si falta un campo, obtendremos un error.fuente
updateValue
(de respuesta aceptada por Filoche) se desaprueba a favor desetValue
updateValue()
e introducirpatchValue
ysetValue
.Aangular 2 final ha actualizado las API. Han agregado muchos métodos para esto.
Para actualizar el control de formulario desde el controlador, haga esto:
No es necesario restablecer los errores.
Referencias
https://angular.io/docs/ts/latest/api/forms/index/FormControl-class.html
https://toddmotto.com/angular-2-form-controls-patch-value-set-value
fuente
setValue()
cuando se llama en aformGroup/formBuilder
, requiere que se configuren todos los valores del formulario.patchValue()
, cuando se llama de la misma manera, podría usarse para actualizar valores específicos.Puede usar los siguientes métodos para actualizar el valor de un control de forma reactiva. Cualquiera de los siguientes métodos se adaptará a sus necesidades.
Métodos que usan setValue ()
Métodos que usan patchValue ()
El último método recorrerá todos los controles del formulario, por lo que no es preferible al actualizar un control único
Puede usar cualquiera de los métodos dentro del controlador de eventos
Puede actualizar varios controles en el grupo de formularios si es necesario utilizando el
fuente
Podrías probar esto:
Para obtener más detalles, puede echar un vistazo al JS Doc correspondiente con respecto al segundo parámetro del
updateValue
método: https://github.com/angular/angular/blob/master/modules/angular2/src/common/forms/model. ts # L269 .fuente
error TS2339: Property 'updateValue' does not exist on type 'AbstractControl'
. En ese componente, el formulario tiene el tipo deControlGroup
. Quizás si los creo individualmente connew Control()
esto funcionaríaNinguno de estos funcionó para mí. Tenía que hacer:
fuente
Si no desea configurar manualmente cada campo.
fuente
Solución actualizada de @ Filoche Angular 2. Utilizando
FormControl
(<Control>this.form.controls['dept']).updateValue(selected.id)
Alternativamente, puede usar la solución de @ AngularUniversity que usa
patchValue
fuente
Sé que la respuesta ya está dada, pero quiero dar una respuesta breve sobre cómo actualizar el valor de un formulario para que otros recién llegados puedan tener una idea clara.
su estructura de formulario es tan perfecta para usarla como ejemplo. entonces, a lo largo de mi respuesta, lo denotaré como la forma.
por lo que nuestra forma es un FormGroup tipo de objeto que tiene tres FormControl .
por lo tanto, al actualizar el valor para una instancia de grupo de formulario que contiene múltiples controles, pero es posible que solo desee actualizar partes del modelo. patchValue () es el que estás buscando.
Veamos un ejemplo. Cuando usas patchValue ()
pero cuando usa setValue () necesita actualizar el modelo completo ya que se adhiere estrictamente a la estructura del grupo de formularios. entonces, si escribimos
Debemos pasar todas las propiedades del modelo de grupo de formulario. Me gusta esto
pero no uso este estilo con frecuencia. Prefiero usar el siguiente enfoque que ayuda a mantener mi código más limpio y más comprensible.
Lo que hago es declarar todos los controles como una variable separada y usar setValue () para actualizar ese control específico.
para el formulario anterior, haré algo como esto.
cuando necesite actualizar el control de formulario, simplemente use esa propiedad para actualizarlo. En el ejemplo, el interlocutor intentó actualizar el control de formulario del departamento cuando el usuario selecciona un elemento de la lista desplegable.
Sugiero echar un vistazo a la API FormGroup para conocer todas las propiedades y métodos de FormGroup.
Adicional : para conocer getter ver aquí
fuente
Si está utilizando el control de formulario, entonces la forma más sencilla de hacerlo:
fuente
Sugerencia: Si está utilizando
setValue
pero no proporciona todas las propiedades en el formulario, obtendrá un error:Must supply a value for form control with name: 'stateOrProvince'.
Por lo tanto, puede tener la tentación de usar
patchValue
, pero esto puede ser peligroso si está tratando de actualizar un formulario completo. Tengo unaddress
que puede no tenerstateOrProvince
ostateCd
dependiendo de si es de EE. UU. O de todo el mundo.En su lugar, puede actualizar de esta manera, lo que utilizará los valores nulos como valores predeterminados:
fuente