angular - 如何在 NgModel 组件和管道角度之间进行通信
问题描述
我创建了一个集成输入字段以执行搜索的组件,但是当我想让它与搜索管道通信时,后者不回答,而当我直接将字段输入集成到正文中时,最后一个与管道通信。
消息搜索组件 html:
<input type="text" [(ngModel)]="searchedTerm">
消息搜索组件 ts:
import { Component, Input } from '@angular/core';
@Component({
selector: 'search-message',
templateUrl: 'search-message.component.html'
})
export class SearchMessageComponent {
@Input() messageSearch: string;
}
应用程序组件 html:
<search-message [messageSearch]="searchTerm"></search-message>
<div class="card" *ngFor="let item of list | search: searchedTerm">
<span [innerHTML]="item.name"></span>
</div>
应用组件 ts ::
import { Component } from '@angular/core';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: [ './app.component.css' ]
})
export class AppComponent {
searchTerm: string;
list = [
{ 'id': 1, 'name': 'apple'},
{ 'id': 1, 'name': 'pineapple'},
{ 'id': 1, 'name': 'jackfruit'},
{ 'id': 1, 'name': 'somefruit'},
];
}
搜索过滤器管道:
import { Pipe, PipeTransform } from '@angular/core';
import { DomSanitizer, SafeHtml } from '@angular/platform-browser';
@Pipe({
name: 'search'
})
export class SearchPipe implements PipeTransform {
constructor(private _sanitizer: DomSanitizer) {}
transform(list: any[], searchText: string): any[] {
if (!list) { return []; }
if (!searchText) { return list; }
searchText = searchText.toLowerCase();
let response = list.filter( item => {
return item.name.toLowerCase().includes(searchText);
});
return response;
}
}
https://stackblitz.com/edit/angular-searchpipe-gnqtgv
解决方案是什么?
解决方案
您可以避免使用管道来过滤(出于性能原因可能应该避免使用它)数据数组。相反,您可以通过以下方式处理它。在您的组件上创建一个表示过滤后的数据列表的新属性。过滤后的结果将保存到此属性中,以避免改变原始列表:
import { Component } from "@angular/core";
@Component({
selector: "my-app",
templateUrl: "./app.component.html",
styleUrls: ["./app.component.css"]
})
export class AppComponent {
searchTerm: string;
list = [
{ id: 1, name: "apple" },
{ id: 1, name: "pineapple" },
{ id: 1, name: "jackfruit" },
{ id: 1, name: "somefruit" }
];
filteredList = [];
ngOnInit() {
this.filteredList = this.list;
}
handleChange($event: string) {
this.filteredList = this.list.filter(e => e.name.toLowerCase().includes($event));
}
}
<search-message (searchChanged)="handleChange($event)"></search-message>
<div class="card" *ngFor="let item of filteredList">
<span [innerHTML]="item.name"></span>
</div>
在您的搜索组件中,您可以使用输出(一种方法)在更改/输入时发出搜索字符串:
import { Component, Input, Output, EventEmitter } from "@angular/core";
@Component({
selector: "search-message",
templateUrl: "search-message.component.html"
})
export class SearchMessageComponent {
searchedTerm: "";
@Input() messageSearch: string;
@Output() searchChanged = new EventEmitter<String>();
handleChange() {
this.searchChanged.emit(this.searchedTerm);
}
}
<input type="text" [(ngModel)]="searchedTerm" (input)="handleChange()">
这是一个实际的例子。
我建议查看有关组件交互的文档/示例,因为它很好地展示了通过输入/输出或更优选共享服务跨组件共享数据的不同方法。
希望这会有所帮助!
推荐阅读
- python - 如何找到字符的索引并删除它后面的字符
- azure - 如何通过 azure 上的 sql 查询获取完整的服务器名称
- .net-core - swashbuckle.aspnetcore 和 swashbuckle 包有什么区别?
- r - 仅考虑 R 中列中具有特定值的行
- excel - 基于单元格值的VBA枢轴过滤器
- python - Spyne 和 Django-silk 的请求后错误
- swift - 我不知道 Swift 返回值是什么
- css - 媒体查询最小宽度在 chrome 中不起作用
- laravel - Laravel 中的两个 orderBy 排序
- jsonschema - Json Schema Form Condition 根据枚举选定项显示/隐藏