Угловой фильтр цен 2 - не может прочитать свойство '0' из неопределенного
Я хотел бы создать ценовой фильтр, который отфильтровывает товары на основе двух переменных. Этими двумя переменными являются минимальная цена и максимальная цена.
В настоящее время я ввел только минимальную цену, чтобы упростить понимание. но при добавлении | priceFilter:priceMinFilter
труба после директивы *ngFor, я получаю это "Cannot read property '0' of undefined
" ошибка.
Я пытаюсь разобраться в этом вопросе, кто-нибудь может дать какой-нибудь совет или сказать, что я здесь делаю не так? Благодарю.
Вот такой вот вздор: https://plnkr.co/tU82lO
app.component.ts
@Component({
selector: 'my-app',
templateUrl: 'src/app.html',
styleUrls: ['src/app.css']
})
export class App {
@Input() priceMinFilter: number;
filterPrice(filter) {
this.priceMinFilter = filter.priceMin;
}
_productList = [
{
"name": "Product One",
"price": 600,
},
{
"name": "Product Two",
"price": 1100,
},
{
"name": "Product Three",
"price": 2150,
},
{
"name": "Product Four",
"price": 3500,
},
{
"name": "Product Five",
"price": 4300,
},
{
"name": "Product Six",
"price": 5400,
},
{
"name": "Product Seven",
"price": 6900,
},
{
"name": "Product Eighth",
"price": 14000,
},
{
"name": "Product Nine",
"price": 26000,
},
{
"name": "Product Ten",
"price": 30000,
},
{
"name": "Product Eleven",
"price": 160000,
},
{
"name": "Product Twelve",
"price": 1000000,
}
]
}
app.component.html
<!-- Title -->
<h2 class="title">Price Filter Pipe with Data Driven Form Approach</h2>
<!-- Filter -->
<zt-filter (filterPrice)='filterPrice($event)'></zt-filter>
<!-- Notification -->
<div class="note" *ngIf="priceMinFilter">
<span>Filtering Products from <strong>{{ priceMinFilter }}</strong></span>
</div>
<!--Product List -->
<div class="price-list">
<div class="product-item" *ngFor="let _product of _productList | priceFilter:priceMinFilter">
<span class="name">{{ _product.name }}</span><span class="price">{{ _product.price | currency:'USD':true:'1.0-2' }}</span>
</div>
</div>
filter.component.ts
@Component({
selector: 'zt-filter',
templateUrl: 'src/filter.component.html',
styleUrls: ['src/filter.component.css']
})
export class FilterComponent implements OnInit {
// Initializing Properties
priceMinFilter: number;
priceFilterForm: FormGroup;
// Outputs
@Output() filterPrice: EventEmitter<{
priceMin: number,
}> = new EventEmitter<{
priceMin: number,
}>();
// Constructor
constructor() {
this.priceFilterForm = new FormGroup({
priceMin: new FormControl('any')
});
this.priceFilterForm.controls['priceMin'].valueChanges.subscribe(
(data: any) => console.log(data)
)
}
// From Actions
onSubmit() {
this.filterPrice.emit({
priceMin: this.priceMinFilter
});
}
// Data
_priceOptions = [
{ "valueP": null },
{ "valueP": 500 },
{ "valueP": 1000 },
{ "valueP": 2000 },
{ "valueP": 3000 },
{ "valueP": 4000 },
{ "valueP": 5000 },
{ "valueP": 10000 },
{ "valueP": 20000 },
{ "valueP": 30000 },
{ "valueP": 40000 },
{ "valueP": 50000 },
{ "valueP": 60000 },
{ "valueP": 70000 },
{ "valueP": 80000 },
{ "valueP": 90000 },
{ "valueP": 100000 },
{ "valueP": 150000 },
{ "valueP": 200000 }
]
}
filter.component.html
<form [formGroup]="priceFilterForm" class="price-filter-form" autocomplete="off" novalidate (ngSubmit)="onSubmit()">
<div class="form-group">
<!-- Min Price Select -->
<label for="price-min">Min Price</label>
<select id="price-min" class="form-control" name="pricemin" [(ngModel)]="priceMinFilter" formControlName="priceMin">
<option *ngFor="let _priceMin of _priceOptions" [value]="_priceMin.valueP">{{ _priceMin.valueP | currency:'USD':true:'1.0-2' }}</option>
</select>
<!-- Filter Button -->
<button type="submit">Filter by Minimum Price!</button>
</div>
</form>
filter.pipe.ts
@Pipe({
name: 'priceFilter'
})
export class PriceFilterPipe implements PipeTransform {
transform(value, args?) {
// ES6 array destructuring
let [minPrice] = args;
return value.filter(_product => {
return _product.valueP >= +minPrice;
});
}
}
Спасибо вам!
1 ответ
Мне удалось решить эту проблему, создав специальный канал фильтра.
Вы можете проверить хранилище по адресу: https://github.com/cstodor/Angular2-Price-Filter
filter.pipe.ts
transform(list, minPrice: number | undefined, maxPrice:number | undefined) {
let filter_list = list;
if (minPrice) {
filter_list = filter_list.filter(_item => {
return _item.price >= +minPrice;
});
}
if (maxPrice) {
filter_list = filter_list.filter(_item => {
return _item.price <= +maxPrice;
});
}
return filter_list;
}
app.component.html
<!-- Title -->
<h2 class="title">Price Filter Pipe with Data Driven Form Approach</h2>
<!-- Filter -->
<zt-filter (filterPrice)='filterPrice($event)' ></zt-filter>
<!-- Notification -->
<div class="note" *ngIf="priceMinFilter || priceMaxFilter">
<span *ngIf="priceMinFilter">Filtering Products from <strong>${{ priceMinFilter }}</strong></span>
<span *ngIf="priceMaxFilter"> to <strong>${{ priceMaxFilter }}</strong>.</span>
</div>
<!--Product List -->
<div class="price-list">
<div class="product-item" *ngFor="let _product of (_productList | priceFilter:priceMinFilter:priceMaxFilter)">
<span class="name">{{ _product.name }}</span><span class="price">{{ _product.price | currency:'USD':true:'1.0-2' }}</span>
</div>
</div>