angular 4アプリケーションを開発していて、データをフォームにバインドしているときに問題に直面しています。バインドコードは問題なく、問題が何であるかわかりません。アプリケーションをデバッグするときに、結果が正しく入力されていることを確認します。次のコード行this.editMovieForm = result; in setFormValues()method。コンソールウィンドウを確認すると、次のエラーが表示されます
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>
あなたの質問から、
次のコード行this.editMovieForm = result;がsetFormValues()メソッドで正しく入力されていることがわかります。コンソールウィンドウを確認すると、次のエラーが表示されます...
太字の行に従ってエラーを見つけたと思います。
FormBuilderは以下のようにeditMovieForm
を作成します。インスタンスオブジェクトに動作するために必要な多数のメソッドが追加されていると思います。
_this.editMovieForm = this.fb.group({
movieId : [''],
title: [''],
releaseYear: [''],
plot: [''],
movieLength: ['']
})
_
しかし、movieService.getMovie()
の結果を変数に割り当てています。
私は、result
がFormGroupオブジェクトではないことを思い込んでいます。もしそうであれば、それがそのように機能しなくなったことは、それほど驚くことではありません。
_this.movieService.getMovie(this.selectMovieId).then((result: any)=> {
...
this.editMovieForm = result;
...
});
_
行をコメントアウトして、エラーが消えるかどうかを確認してください。
フォームに結果を追加するために必要なのは、patchValue
に続く行だけです。
_this.editMovieForm.patchValue(existingMovie, { onlySelf: true });
_
EditMovieFormプロパティはFormGroupタイプです。 Doc: https://angular.io/api/forms/FormGroup
あなたのメソッドthis.movieService.getMovie()が映画の配列を返すと思います。コールバックでは、editMovieFormを映画の配列である別のタイプの値で設定し、 patchValue関数は含まれていません。
行コードを削除する必要があります:
this.editMovieForm = result;
次に、PatchValueまたはSetValueを使用して、editMovieFormに値をパッチまたは設定します。
これで問題が解決するはずです。
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;
}