属性 在 angular 12 应用程序中不存在 NgModel 和管道

Property does not exist with NgModel and pipe in angular 12 app

我是 angular 12 岁的新人, 我创建了一个搜索输入和一个静态数据列表,我决定写一个管道来在我搜索某些东西时过滤数据, 因此,在我将管道添加到 ngFor 之后,我收到一条错误消息: 错误:src/app/template/ui/pages/courses/courses.component.html:23:78 - 错误 TS2339:属性 'query' 在类型 'CoursesComponent'.

上不存在
23       <div class="col-12 col-lg-4" *ngFor="let item  of data | searchFilter: query ">
                                                                                ~~~~~

  src/app/template/ui/pages/courses/courses.component.ts:13:16
    13   templateUrl: './courses.component.html',
                      ~~~~~~~~~~~~~~~~~~~~~~~~~~
    The error occurs in the template of component CoursesComponent.

所以我在这里检查了现有的答案,但是 none 谈论 Pipe 和 NgModel 所以这是我的烟斗:

import { Pipe, PipeTransform } from "@angular/core";

@Pipe({
    name: 'searchFilterPipe'
})

export class SearchFilterPipe implements PipeTransform {

    transform(value: any, args?: any): any {
        if(!value) return null;
        if(!args) return value;
  
        args = args.toLowerCase();
  
        return value.filter(function(data: any){
            return JSON.stringify(data).toLowerCase().includes(args);
        });
    }

}

这是我的看法:

 <form action="">
              <div class="input-group mb-4 border rounded-pill p-1">
                <input id="searchInputtwo" type="search"  [(ngModel)]="query" placeholder="What're you searching for?" aria-describedby="button-addon3" class="form-control bg-none border-0" >
                <div class="input-group-append border-0">
                  <button id="button-addon3" type="submit" class="btn btn-link text-dark"><i class="fa fa-search"></i></button>
                </div>
              </div>
            </form>
          </div>
    </div>
    <div class="row" id="lessonList">
      <div class="col-12 col-lg-4" *ngFor="let item  of data | searchFilter: query ">
        <div class="card mb-4 mb-lg-0 border-secondary shadow">
          <img src="{{item.image}}" alt="Animations CSS modernes" class="card-img-top">
          <div class="card-body">
            <h5 class="card-title">{{ item.title }}</h5>
            <p class="card-text">{{item.text}}</p>
            <a href="courses/details/{{item.id}}" class="btn btn-info btn--start ">Démarrer l'apprentissage</a>
          </div>
        </div>
      </div>

这是我的 Ts 文件:

import { Component, Input, OnInit, NgModule } from '@angular/core';    
import { chapterModel } from 'src/app/core/models/chapter.model';
import { competencesModel } from 
 'src/app/core/models/competences.model';
import { CourseModel } from 'src/app/core/models/course.model';
import { preriquisiteModel } from 
'src/app/core/models/preriquisite.model';
import { teacherModel } from 'src/app/core/models/teacher.model';
import { SearchService } from 'src/app/core/services/search.service';


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

  public searchFilter: any = '';
  public data:CourseModel[];

  constructor(private searchService: SearchService) {
    this.data = [
      new CourseModel(1,"Créez des animations CSS","Vous allez plonger dans le monde des animations CSS pour donner vie à vos pages web !",
      [new chapterModel(1,"coo","text")],false,
      [new preriquisiteModel(2,"Programmation JavaScript","Programmation JavaScript","Learn Java Script !")],
       [ new competencesModel("Savoir Faire des animations")], [ new teacherModel(52,"Laura DuFont") ],
       "assets/images/lessons/css.jpeg"),

       new CourseModel(2,"Programmer avec JavaScript","Ce cours est conçu pour vous enseigner les bases du langage de programmation JavaScript.",
       [new chapterModel(1,"coo","text")],false,
       [new preriquisiteModel(1,"Programmation html/css","Programmation html/css","Learn Html/Css !")],
        [ new competencesModel("Savoir le language Java Script")], [ new teacherModel(53,"Will Alexander") ],
        "assets/images/lessons/js.jpeg"),

        new CourseModel(3,"Les fondamentaux de Swift","Découvrez le développement iOS et réalisez des applications taillées pour l'iPhone et l'iPad !",
        [new chapterModel(1,"coo","text")],false,
        [new preriquisiteModel(2,"Programmation ","Programmation ","Learn Swift !")],
         [ new competencesModel("Savoir programmer pour Iphone et Ipad")], [ new teacherModel(54,"Jamie Sutherland") ],
         "assets/images/lessons/swift.jpeg"),
    ];
   }

  ngOnInit(): void {
  
  }

 searchForm(){
   this.searchService.searchAndFilterCourses(this.searchFilter);
   console.log(this.searchFilter);

   }

}

我从 Angular 9 的教程中获取了这段代码,但我不知道我的 angular 12 是否需要不同的语法。

我的目标是找到此问题的解决方案,并使该错误的所有未来受害者都可以使用该解决方案。

当您使用 [(ngModel)] 时,您将输入字段的值绑定到组件的 TS 文件中的 属性。在你的情况下你有 [(ngModel)]="query" 这意味着它期望 属性 query 存在。

但是在你的 TS 文件中你只定义了 searchFilterdata。添加 public query = ''; 它应该不会再给你错误。

此外,您不需要设置管道,除非您计划在您的应用中多次使用此过滤逻辑。如果它只发生在这个组件中,您应该将过滤逻辑保留在组件的 TS 文件中。