web-dev-qa-db-fra.com

_this.form.get n'est pas une fonction dans angular4

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>
5
Tom

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

3
Richard Matsen

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.

0
Nicolas Law-Dune

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;  
} 
0
Manzurul