Мой проект был написан на AngularJS, и теперь он мигрирует на современный Angular 8.
Один из шагов миграции - переписать код с Javascript на Typescript. И я столкнулся с непростой проблемой с функцией фильтра ng-repeat.
Что у меня было. Шаблон HTML:
<div ng-repeat="menuItem in items| filter: vm.filterMenuItem">
Немного странно, что при вызове функции вам не нужно указывать переданный аргумент.
И код JS:
function filterMenuItem(menuItem) {
let paramFits = vm.filters.param === 0 || menuItem.param === vm.filters.param;
let anotherParamFits = vm.filters.anotherParam === 0 || menuItem.anotherParam === vm.filters.anotherParam;
return paramFits && anotherParamFits;
}
Где vm.filters
- переменная уровня контроллера, которую можно изменить из шаблона.
Затем я переписал его в TS:
filterMenuItem(menuItem: MenuItemClass) {
let paramFits = this.filters.param === 0 || menuItem.param === this.filters.param;
let anotherParamFits = this.filters.anotherParam === 0 || menuItem.anotherParam === this.filters.anotherParam;
return paramFits && anotherParamFits;
}
... и все сломалось. По некоторым причинам AngularJS не распознает соответствующий рычаг контроллера this
внутри функции. В этом случае this
не определено.
Есть ли способ сохранить пользовательскую функцию фильтра с помощью Typescript?