【问题标题】:Property does not exist with NgModel and pipe in angular 12 appAngular 12 应用程序中的 NgModel 和管道不存在属性
【发布时间】:2021-07-19 23:24:20
【问题描述】:

我是 Angular 12 的新手, 我创建了一个搜索输入和一个静态数据列表,我决定在搜索某些内容时编写一个管道来过滤数据, 因此,在我在 ngFor 中添加管道后,我收到一条错误消息: 错误:src/app/template/ui/pages/courses/courses.component.html:23:78 - 错误 TS2339:“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.

所以我在这里检查了现有的答案,但没有人谈论 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 是否需要不同的语法。

我的目标是找到解决此问题的方法,并将该解决方案提供给该错误所有可能的未来受害者。

【问题讨论】:

    标签: angular angular12


    【解决方案1】:

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

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

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

    【讨论】:

    • 啊不,我认为我从教程中取出的管道使数据最初消失了,只有当我在文本输入中写一些东西时,数据才会再次出现,是的,我使用管道,因为我打算在很多地方使用相同的逻辑,你能帮我规范化管道功能,使其在我在输入框中写东西之前停止让数据消失吗?提前感谢您的解决方案
    • 我认为它根本无法正常工作,我必须按两次路线才能显示视图,我认为管道的解决方案给应用程序带来了很多问题,因为我试过了,必须有一些替代品
    • 当我删除 ngModel 时问题就消失了!但问题是如何在没有 ngModel 的情况下获取 input 的值?
    • 您可以使用模板引用,但我不同意将此代码放入组件中,因为管道会在您调用时记住 equals 参数的返回,而不是每次都执行
    • 也许 stackblitz 链接会有所帮助,因为从我在您的示例中看到的情况来看,没有任何效果。您的 TS 文件中没有定义 query。您正在声明管道searchFilterPipe,但您从不使用它。您的模板正在尝试使用管道 searchFilter,这是一个空字符串的本地属性。最后,我们无法看到 SearchService 文件中的逻辑。
    猜你喜欢
    • 2017-03-13
    • 1970-01-01
    • 2020-08-09
    • 2019-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-31
    相关资源
    最近更新 更多