У меня есть html-тег select
, и я хочу отфильтровать свой список результатов по выбранному значению. Я использую канал, чтобы показать их в списке, созданном *ngFor
. когда я добавляю новый элемент, тег select добавляет новый параметр, даже если параметр с таким же именем еще существует. Как я мог это исправить? Я хочу, чтобы в моем теге выбора отображалось только уникальное значение (Фильтр ???). Я бы тоже хотел установить значение по умолчанию.
Скриншот:
App.component.html:
<div class = "container">
<div class = "row">
<div class = "col-xs-12 col-sm-10 col-md-8 col-sm-offset-1 col-md-offset-2">
<select
name = "serverStatus"
id = "serverStatus"
[(ngModel)] = "filteredStatus">
<option
*ngFor = "let server of servers"
value = "{{server.status}}">{{server.status}}</option>
</select>
<hr>
<ul class = "list-group">
<li
class = "list-group-item"
*ngFor = "let server of servers | filter:filteredStatus:'status'"
[ngClass] = "getStatusClasses(server)">
<span
class = "badge">
{{ server.status }}
</span>
<strong>{{ server.name }}</strong> |
{{ server.instanceType | uppercase }} |
{{ server.started | date:'fullDate' | uppercase }}
</li>
</ul>
</div>
App.component.ts:
import { Component } from '@angular/core';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
servers = [
{
instanceType: 'medium',
name: 'Production Server',
status: 'stable',
started: new Date(15, 1, 2017)
},
{
instanceType: 'large',
name: 'User Database',
status: 'stable',
started: new Date(15, 1, 2017)
},
{
instanceType: 'small',
name: 'Development Server',
status: 'offline',
started: new Date(15, 1, 2017)
},
{
instanceType: 'small',
name: 'Testing Environment Server',
status: 'critical',
started: new Date(15, 1, 2017)
}
];
filteredStatus = '';
getStatusClasses(server: {instanceType: string, name: string, status: string, started: Date}) {
return {
'list-group-item-success': server.status === 'stable',
'list-group-item-warning': server.status === 'offline',
'list-group-item-danger': server.status === 'critical'
};
}
}
fiter.pipe.ts:
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
name: 'filter'
})
export class FilterPipe implements PipeTransform {
transform(value: string[], filterString: string, propName:string): any {
if (value.length === 0 || filterString === '') {
return value;
}
const resultArray = [];
for (const item of value) {
if (item[propName] === filterString) {
resultArray.push(item)
}
}
return resultArray;
}
}
Вот рабочий пример stackblitz: https://angular-rwmfbj.stackblitz.io Редактор: https://stackblitz.com/edit/angular-nck1kn
если я добавляю сервер со статусом «стабильный», я вижу более длинный список значений параметров на выбор, три типа «стабильный», но мне нужен только один, чтобы применить фильтр. Я добавил скриншот
Попробуй это
App.component.ts
import { Component } from '@angular/core';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
servers = [
{
instanceType: 'medium',
name: 'Production Server',
status: 'stable',
started: new Date(15, 1, 2017)
},
{
instanceType: 'large',
name: 'User Database',
status: 'stable',
started: new Date(15, 1, 2017)
},
{
instanceType: 'small',
name: 'Development Server',
status: 'offline',
started: new Date(15, 1, 2017)
},
{
instanceType: 'small',
name: 'Testing Environment Server',
status: 'critical',
started: new Date(15, 1, 2017)
}
];
filteredStatus = '';
serverStatus: {
instanceType: string,
name: string,
status: string,
started: Date
}[] = [];
constructor(){
this.initializeStatus();
//For setting the default value of the select try this
if (this.serverStatus.length != 0)
this.filteredStatus = this.serverStatus[0].status;
}
getStatusClasses(server: {instanceType: string, name: string, status: string, started: Date}) {
return {
'list-group-item-success': server.status === 'stable',
'list-group-item-warning': server.status === 'offline',
'list-group-item-danger': server.status === 'critical'
};
}
//Initalize the status
initializeStatus(){
this.serverStatus = [];
//Container for the current status
let currentStatus = "";
for(let x of this.servers){
if (x.status != currentStatus){
this.serverStatus.push(x);
}
//Equate for reference
currentStatus = x.status;
}
}
}
В App.component.html
замените *ngFor = "let server of servers"
на этот *ngFor = "let server of serverStatus"
В это было трудно поверить, но мой код, основанный на этом примере, не работал, пока я явно не добавил поле «имя» с некоторым значением в текстовое поле ввода. Во время фильтрации ничего не произошло
Я не уверен, что полностью понимаю ошибку. Кажется, ваш пример работает нормально, можете ли вы уточнить, почему это нежелательное поведение?