Я создал канал фильтра для фильтрации массива объектов. Этот канал получает объект filterArgs
, который содержит некоторые свойства, на основе которых элементы должны быть отфильтрованы.
@Pipe({
name: 'filter'
})
export class FilterPipe implements PipeTransform {
transform(items: Item[], filterArgs: any): Item[] {
return items.filter(item => ...);
}
}
Кроме того, у меня есть несколько полей ввода, в которых пользователи могут устанавливать аргументы фильтра. Я связываю свойства объекта filterArgs
напрямую и применяю фильтр к таким элементам:
<input type="date" [(ngModel)]="filterArgs.dateFrom">
<input type="date" [(ngModel)]="filterArgs.dateTo">
<ul>
<li *ngFor="let item of items | filter:filterArgs>...</li>
</ul>
В моем компоненте объект filterArgs
определяется следующим образом (схематично):
public filterArgs: any;
ngOnInit() {
this.filterArgs = {
dateFrom = undefined,
dateTo = undefined
};
}
Итак, проблема в том, что фильтр не применяется при изменении одного из полей ввода. Насколько я понял обнаружение изменений Angular, это связано с тем, что ссылка на объект filterArgs
не изменяется, и поэтому Angular не обнаруживает никаких изменений. Это ожидаемое поведение и дизайн.
Теперь мой вопрос: каков предлагаемый способ решения этой проблемы?
Наивным подходом было бы создание нового объекта filterArgs
каждый раз при изменении поля ввода, чтобы ссылка на этот объект обновлялась. В этом случае сработает обнаружение изменений Angular. Но должен быть лучший способ сделать это. Я бы подумал, что мог бы аннотировать свойство filterArgs
каким-то атрибутом, который сообщает Angular выполнять «глубокое сравнение объектов» для обнаружения изменений.