Быстрый ответ:
«Моя первая проблема заключается в том, что канал не вызывает при изменении gridFilters»:
РЕКОМЕНДУЕТСЯ: Оставьте свой канал какчистый канал и переназначить gridFilters
вместо его изменения.Другими словами, вместо использования ngModel в вашем dt-column-header
компоненте, используйте входное событие и переназначьте переменную gridFilters
.
ИЛИ (НЕ РЕКОМЕНДУЕТСЯ): Сделайте вашу трубу нечистый канал , добавив pure: false
в декоратор @Pipe
:
@Pipe({
name: 'searchFilter',
pure: false
})
См. StackBlitz DEMO с рабочим примером кода.
«Другая проблема заключается в том, что труба работает нормально с ... но не работает с ней»:
Проблема с кодом трубы:
return items.filter(item => {
return filterKeys.some((keyName) => {
return new RegExp(filter[keyName], 'gi').test(item[keyName]) || filter[keyName] == "";
});
});
Видимо, вы не получилирезультат, который вы хотели получить.Проблема в том, что вы не упомянули результат, который хотите получить, что вы имеете в виду, что работаете / не работаете?отредактируйте свой вопрос с вашими потребностями, и я обновлю свой ответ.
Подробный ответ
объяснение чистых / нечистых труб:
Ваша труба pure pipe (тип канала по умолчанию, когда метаданные не используются pure: false
в @Pipe decorator).Чистый канал будет выполняться только в случае изменения примитивного входного значения (String, Number, Boolean, Symbol) или изменения ссылки на объект (Date, Array, Function, Object).
Angular Docs - Чистые трубы
Таким образом, у вас есть 2 варианта решения:
Решение 1 (рекомендуется) :
В заказечтобы ваш канал снова вызывался при изменении gridFilters, вам нужно переназначить его вместо его изменения .Другими словами, вместо использования ngModel в компоненте dt-column-header
используйте событие ввода и переназначьте переменную gridFilters
.
Решение 2 (не рекомендуется) :
Сделайте вашу трубу нечистой трубкой , добавив pure: false
в @Pipe
декораторе:
@Pipe({
name: 'searchFilter',
pure: false
})
На этот раз ваша труба будет выполняться в каждом цикле обнаружения изменений компонентов.Вот почему это решение не рекомендуется, потому что оно будет вызываться часто, так же часто, как каждое нажатие клавиши или движение мыши.
Angular Docs - нечистые каналы говорит:
Имея это в виду, с большой осторожностью используйте нечистую трубу.Дорогая, долго работающая труба может испортить впечатление пользователя.