我正在尝试创建一个页面,以显示从数据库返回的所有值。它应使用ngFor显示表行中的所有数据,并且当双击该行或单击该行左侧的编辑按钮时,应使用一个充满输入字段的ng-template替换该行,方法是调用.ts文件中的editMovie()函数。

问题是,当应调用editMovie()时,我在控制台中收到此错误。



我看到双击行(请参见html的第20行)和单击编辑按钮(请参见html的第52行)时均会引发此错误。这使我相信问题与.ts文件有关。我也将console.log()放在editMovie()的第一行中,但未显示,这使我相信在实际运行editMovie之前会抛出错误。

movie.component.html

<div class="row">
  <div class="col-md-2"></div>
  <div class="col-md-8">

    <div class="movies" *ngIf="moviesList">
      <table class="table">
        <thead class="h">
          <tr class="h">
            <th class="h">Title</th>
            <th class="h">Genre</th>
            <th class="h">Description</th>
            <th class="h">Date Released</th>
            <th class="h">Link</th>
            <th class="h">Seen</th>
            <th class="h">Options</th>
          </tr>
        </thead>
        <tbody>

          <tr class="movie" (dblclick)="editMovie(movie)" *ngFor="let movie of moviesList">

            <ng-container *ngIf="!editMovies.includes(movie); else editMovie">
              <td>{{movie.title}}</td>
              <td>{{movieGenres[movie.genre - 1].Name}}</td>
              <td>{{movie.description}}</td>
              <td>{{movie.dateMade | date}}</td>
              <td>{{movie.link}}</td>
              <td>{{movie.seen}}</td>
            </ng-container>

            <ng-template #editMovie>
              <td><input type="text" name="title" id="title" (keypress)="submitMovie($event, movie)" [(ngModel)]="movie.title" placeholder="Title" class="form-control"></td>
              <td><select name="genre" id="genre" [(ngModel)]="movie.genre" class="form-control">
                  <option *ngFor="let genre of movieGenres" [ngValue]="genre.Value">
                      {{genre.Name}}
              </select></td>
              <td><input type="text" name="description" id="description" (keypress)="submitMovie($event, movie)" [(ngModel)]="movie.description" placeholder="Description" class="form-control"></td>
              <td><input type="date" name="dateMade" id="dateMade" (keypress)="submitMovie($event, movie)" [(ngModel)]="movie.dateMade" placeholder="Date Released" class="form-control"></td>
              <td><input type="text" name="link" id="link" (keypress)="submitMovie($event, movie)" [(ngModel)]="movie.link" placeholder="Link"class="form-control"></td>
              <td>
                <input type="text" name="seen" id="seen" (keypress)="submitMovie($event, movie)" [(ngModel)]="movie.seen" placeholder="Seen?" class="form-control">
              </td>
            </ng-template>

            <td class="o">
              <button class="btn btn-success" (click)="seenMovie(movie)" *ngIf="movie.seen == false">
                <i class="fa fa-check"></i>
              </button>
              <button class="btn btn-danger" (click)="seenMovie(movie)" *ngIf="movie.seen == true">
                <i class="fa fa-times"></i>
              </button>
              <button class="btn btn-primary" (click)="editMovie(movie)">
                  <i class="fa fa-pencil"></i>
                </button>
              <button class="btn btn-danger" (click)="deleteMovie(movie)">
                  <i class="fa fa-trash"></i>
                </button>
            </td>

          </tr>
        </tbody>
      </table>
    </div>


    <form>
      <div class="form-row">

        <div class="col-md-5">
          <input type="text" name="title" id="title" [(ngModel)]="newMovie.title" placeholder="Title" class="form-control">
        </div>
        <div class="col-md-5">
          <select name="genre" id="genre" [(ngModel)]="newMovie.genre" class="form-control">
              <option *ngFor="let genre of movieGenres" [ngValue]="genre.Value">
                  {{genre.Name}}
          </select>
        </div>
        <div class="col-md-5">
          <input name="description" id="description" [(ngModel)]="newMovie.description" placeholder="Description" class="form-control">
        </div>
        <div class="col-md-5">
          <input type="date" name="dateMade" id="dateMade" [(ngModel)]="newMovie.dateMade" placeholder="Date Released" class="form-control">
        </div>
        <div class="col-md-5">
          <input name="link" id="link" [(ngModel)]="newMovie.link" placeholder="Link" class="form-control">
        </div>
        <div class="col-md-5">
          <input name="seen" id="seen" [(ngModel)]="newMovie.seen" placeholder="Seen?" class="form-control">
        </div>
        <div class="col-md-2">
          <button type="submit" class="btn btn-primary" (click)="create()">Add</button>
        </div>
      </div>
    </form>
  </div>
  <div class="col-md-2">

  </div>
</div>


movie.component.ts
import { Response } from '@angular/http';
import { MovieService } from '../services/movie.service';
import Movie from '../models/movie.model';
import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'app-movie',
  templateUrl: './movie.component.html',
  styleUrls: ['./movie.component.scss']
})
export class MovieComponent implements OnInit {

  constructor(
    private movieService: MovieService
  ) { }

  movieGenres = [
    {
      Name: "Action",
      Value: 1
    },
    {
      Name: "Comedy",
      Value: 2
    },
    {
      Name: "Drama",
      Value: 3
    },
    {
      Name: "Sci Fi",
      Value: 4
    }
  ];

  //Declaring the new todo Object and initilizing it
  public newMovie: Movie = new Movie()

  //An Empty list for the visible todo list
  moviesList: Movie[];
  editMovies: Movie[] = [];


  ngOnInit(): void {
    this.movieService.getMovies()
      .subscribe(movies => {
        this.moviesList = movies
      })
  }

  create() {
    this.movieService.createMovie(this.newMovie)
      .subscribe((res) => {
        this.moviesList.push(res.data)
        this.newMovie = new Movie()
      })
  }

  editMovie(movie: Movie) {
    if(this.moviesList.includes(movie)){
      if(!this.editMovies.includes(movie)){
        this.editMovies.push(movie)
      }else{
        this.editMovies.splice(this.editMovies.indexOf(movie), 1)
        this.movieService.editMovie(movie).subscribe(res => {
          console.log('Update Succesful')
         }, err => {
            this.editMovie(movie)
            console.error('Update Unsuccesful')
          })
        }
      }
    }

    seenMovie(movie:Movie){
      movie.seen = true
      this.movieService.editMovie(movie).subscribe(res => {
        console.log('Update Succesful')
      }, err => {
        this.editMovie(movie)
        console.error('Update Unsuccesful')
      })
    }

    unseenMovie(movie:Movie){
      movie.seen = false
      this.movieService.editMovie(movie).subscribe(res => {
        console.log('Update Succesful')
      }, err => {
        this.editMovie(movie)
        console.error('Update Unsuccesful')
      })
    }

    submitMovie(event, movie:Movie){
      if(event.keyCode ==13){
        this.editMovie(movie)
      }
    }

    deleteMovie(movie: Movie) {
      this.movieService.deleteMovie(movie._id).subscribe(res => {
        this.moviesList.splice(this.moviesList.indexOf(movie), 1);
      })
    }

}

最佳答案

模板引用变量(#editMovie)和方法viz具有相同的名称。 editMovie 。回覆

07-25 23:32