Существует два типа труб.Чистый и нечистый.В случае чистого канала функция преобразования канала вызывается только тогда, когда angular обнаруживает изменение значения или аргументов, переданных в канал.В нечистом канале он вызывается для каждого цикла обнаружения изменений независимо от того, изменяются ли значение или аргументы каналов.Поскольку ваш канал чистый, функция преобразования не вызывается, потому что datasource
является массивом объектов, поэтому angular не обнаруживает изменение его значения, поскольку значение, т. Е. data
, является массивом, а не примитивным типом, т. Е. (String, boolean,int etc) Существует три способа решения этой проблемы:
1. Выполните следующие строки кода после data
в ваших изменениях логики, которые назначат новый объект для data
, который вызоветpipe, то есть trasnform
функция pipe будет выполняться, и вы получите новое значение источника данных в нем:
var tempVar= this.data;
this.data= [];
Object.assign(this.testVal, tempVar);
Просто запускайте три вышеупомянутые строки всякий раз, когда вы обновляете this.data
т.е.
2.Измените свою трубу на нечистую.Однако это будет неэффективно, потому что преобразование будет вызываться каждый раз, когда обнаружение изменения угловых прогонов замедляет работу вашего приложения.Вы можете сделать это следующим образом: установить чистый флаг в false в декораторе @Pipe
:
@Pipe({
name: 'defaultImage',
pure: false
})
Используйте аргумент типа временного примитива для канала и обновите его значение при изменении
data
, что приведет к выполнению функции преобразования канала с новым источником данных, например, в вашем html:
Добавьте его в функцию преобразования, например:
transform(value: string, fallback: string, tempParam)
И меняйте его значение всякий раз, когда data
изменяется в вашей логике.