Je développe une application angulaire 4 et je fais face à un problème tout en liant les données au formulaire. Le code contraignant semble être bon et ne sait pas quel est le problème. Lorsque je débogue l'application, je peux voir que le résultat est rempli correctement dans la ligne de code suivante this.editMovieForm = result; dans la méthode setFormValues (). Lorsque je vérifie la fenêtre de la console, l'erreur suivante apparaît.
EditmovieComponent.html:1 ERROR TypeError: _this.form.get is not a function
at forms.es5.js:4907
at Array.forEach (<anonymous>)
at FormGroupDirective.webpackJsonp.../../../forms/@angular/forms.es5.js.FormGroupDirective._updateDomValue (forms.es5.js:4906)
at FormGroupDirective.webpackJsonp.../../../forms/@angular/forms.es5.js.FormGroupDirective.ngOnChanges (forms.es5.js:4774)
at checkAndUpdateDirectiveInline (core.es5.js:10840)
at checkAndUpdateNodeInline (core.es5.js:12341)
at checkAndUpdateNode (core.es5.js:12284)
at debugCheckAndUpdateNode (core.es5.js:13141)
at debugCheckDirectivesFn (core.es5.js:13082)
at Object.eval [as updateDirectives] (EditmovieComponent.html:1)
ERROR Error: Uncaught (in promise): TypeError: _this.editMovieForm.patchValue is not a function
TypeError: _this.editMovieForm.patchValue is not a function
at main.bundle.js:446
at ZoneDelegate.webpackJsonp.../../../../zone.js/dist/zone.js.ZoneDelegate.invoke (polyfills.bundle.js:2908)
at Object.onInvoke (vendor.bundle.js:146628)
at ZoneDelegate.webpackJsonp.../../../../zone.js/dist/zone.js.ZoneDelegate.invoke (polyfills.bundle.js:2907)
at Zone.webpackJsonp.../../../../zone.js/dist/zone.js.Zone.run (polyfills.bundle.js:2658)
at polyfills.bundle.js:3389
at ZoneDelegate.webpackJsonp.../../../../zone.js/dist/zone.js.ZoneDelegate.invokeTask (polyfills.bundle.js:2941)
at Object.onInvokeTask (vendor.bundle.js:146619)
at ZoneDelegate.webpackJsonp.../../../../zone.js/dist/zone.js.ZoneDelegate.invokeTask (polyfills.bundle.js:2940)
at Zone.webpackJsonp.../../../../zone.js/dist/zone.js.Zone.runTask (polyfills.bundle.js:2708)
at main.bundle.js:446
at ZoneDelegate.webpackJsonp.../../../../zone.js/dist/zone.js.ZoneDelegate.invoke (polyfills.bundle.js:2908)
at Object.onInvoke (vendor.bundle.js:146628)
at ZoneDelegate.webpackJsonp.../../../../zone.js/dist/zone.js.ZoneDelegate.invoke (polyfills.bundle.js:2907)
at Zone.webpackJsonp.../../../../zone.js/dist/zone.js.Zone.run (polyfills.bundle.js:2658)
at polyfills.bundle.js:3389
at ZoneDelegate.webpackJsonp.../../../../zone.js/dist/zone.js.ZoneDelegate.invokeTask (polyfills.bundle.js:2941)
at Object.onInvokeTask (vendor.bundle.js:146619)
at ZoneDelegate.webpackJsonp.../../../../zone.js/dist/zone.js.ZoneDelegate.invokeTask (polyfills.bundle.js:2940)
at Zone.webpackJsonp.../../../../zone.js/dist/zone.js.Zone.runTask (polyfills.bundle.js:2708)
at resolvePromise (polyfills.bundle.js:3340)
at polyfills.bundle.js:3392
at ZoneDelegate.webpackJsonp.../../../../zone.js/dist/zone.js.ZoneDelegate.invokeTask (polyfills.bundle.js:2941)
at Object.onInvokeTask (vendor.bundle.js:146619)
at ZoneDelegate.webpackJsonp.../../../../zone.js/dist/zone.js.ZoneDelegate.invokeTask (polyfills.bundle.js:2940)
at Zone.webpackJsonp.../../../../zone.js/dist/zone.js.Zone.runTask (polyfills.bundle.js:2708)
at drainMicroTaskQueue (polyfills.bundle.js:3118)
at ZoneTask.webpackJsonp.../../../../zone.js/dist/zone.js.ZoneTask.invokeTask [as invoke] (polyfills.bundle.js:3019)
at invokeTask (polyfills.bundle.js:4056)
at XMLHttpRequest.globalZoneAwareCallback (polyfills.bundle.js:4082)
editmovie.component.ts
import { Component, OnInit } from '@angular/core';
import {Router,ActivatedRoute,Params} from '@angular/router';
import {FormGroup,FormControl,FormBuilder} from '@angular/forms';
import {iMovie} from '../movie.interface';
import {MovieService} from '../movie.service';
@Component({
selector: 'app-editmovie',
moduleId: module.id,
templateUrl: './editmovie.component.html',
styleUrls: ['./editmovie.component.css'],
providers:[MovieService]
})
export class EditmovieComponent implements OnInit {
public selectMovieId: number = 0;
public sub : any;
public editMovieForm: FormGroup;
public movie: iMovie;
constructor(private _route: ActivatedRoute,
private fb: FormBuilder,
private movieService : MovieService ) {
this.initializeFormModel();
}
ngOnInit() {
this.sub = this._route.params.subscribe(params => {
this.selectMovieId = + params['id']; // (+) converts string to number
});
this.initializeFormModel();
if(this.selectMovieId && this.selectMovieId > 0) {
this.setFormValues();
}
}
initializeFormModel()
{
this.editMovieForm = this.fb.group({
movieId : [''],
title: [''],
releaseYear: [''],
plot: [''],
movieLength: ['']
})
}
setFormValues(){
var existingMovie: iMovie;
this.movieService.getMovie(this.selectMovieId).then((result: any)=> {
existingMovie = result;
this.movie = existingMovie;
this.editMovieForm = result;
this.editMovieForm.patchValue(existingMovie, { onlySelf: true });
});
}
}
editmovie.component.html
<form [formGroup] = "editMovieForm">
<div class ="col-sm-12">
<div class="form-group col-sm-6">
<label for="movie-title" class="control-label">Title</label>
<input type="text" class="form-control" id= "movie-title" placeholder="Title of Movie" formControlName="title" maxlength="100">
</div>
<div class="form-group col-sm-6">
<label for="release-year" class="control-label">Release Year</label>
<input type="text" class="form-control" id="release-year" placeholder="Release Year" formControlName="releaseYear" maxlength="4">
</div>
</div>
<div class ="col-sm-12">
<div class="form-group col-sm-6">
<label for="movie-plot" class="control-label">Plot</label>
<input type="text" class="form-control" id= "movie-plot" placeholder="Plot" formControlName="plot" maxlength="100">
</div>
<div class="form-group col-sm-6">
<label for="movie-length" class="control-label">Movile Length</label>
<input type="text" class="form-control" id= "movie-length" placeholder="Movie Length" formControlName="movieLength" maxlength="100">
</div>
</div>
</form>
De votre question,
Je peux voir que le résultat est rempli correctement dans la ligne de code suivante this.editMovieForm = result; dans la méthode setFormValues (). Lorsque je vérifie la fenêtre de la console, je vois l'erreur suivante ...
Je suppose qu’en suivant la ligne en gras, vous repérez l’erreur.
FormBuilder crée editMovieForm
comme ci-dessous, et je suppose que de nombreuses méthodes ont été ajoutées à l'objet d'instance pour qu'il puisse fonctionner.
this.editMovieForm = this.fb.group({
movieId : [''],
title: [''],
releaseYear: [''],
plot: [''],
movieLength: ['']
})
Mais vous affectez le résultat de movieService.getMovie()
à la variable.
Je suppose que result
n'est pas un objet FormGroup. Si tel n'est pas le cas, il n'est pas vraiment surprenant qu'il ne fonctionne plus comme tel.
this.movieService.getMovie(this.selectMovieId).then((result: any)=> {
...
this.editMovieForm = result;
...
});
S'il vous plaît essayez de commenter la ligne et voir si l'erreur disparaît.
Je pense que vous constaterez que la ligne suivante avec patchValue
est tout ce dont vous avez besoin pour ajouter le résultat au formulaire.
this.editMovieForm.patchValue(existingMovie, { onlySelf: true });
Ref Mise à jour de Angular 2 Formulaires avec patchValue ou setValue
Votre propriété editMovieForm est un type FormGroup. Doc: https://angular.io/api/forms/FormGroup
Je suppose que votre méthode this.movieService.getMovie () renvoie un tableau de films . Dans votre rappel, vous définissez votre editMovieForm avec une valeur de type différente qui correspond à Array of Movie et ne contient pas la fonction patchValue.
Vous devez supprimer votre code de ligne:
this.editMovieForm = result;
Puis corrigez ou définissez des valeurs sur votre editMovieForm à l'aide de PatchValue ou de SetValue.
Cela devrait résoudre votre problème.
initializeFormModel()
{
this.editMovieForm = this.fb.group({
movieId : [this.movie.movieId],
title: [this.movie.title],
releaseYear: [this.movie.releaseYear],
plot: [this.movie.plot],
movieLength: [this.movie.movieLength]
})
}
setFormValues(){
this.movieService.getMovie(this.selectMovieId).then((result: any)=> {
this.movie = result;
}