由于pages
管道,已从normalizeUri
数组中删除项目后,无法刷新模板。没有normalizeUri
管道,相同的代码也可以正常工作。您能告诉我管道实施的问题是什么吗?即,如果有管道,为什么模板不更新。
.html
<ion-slides pager (ionSlideDidChange)="slideChanged()">
<ion-slide *ngFor='let page of pages | normalizeUri'>
<img [src]='page' />
</ion-slide>
</ion-slides>
.ts
async removePage() {
try {
await SbSdk.removePage({ page: this.selectedPage });
let pageIndexToRemove = null;
this.pages.forEach((p, index) => {
if (this.selectedPage.pageId === p.pageId) {
pageIndexToRemove = index;
}
});
this.pages.splice(pageIndexToRemove, 1);
this.selectedPage = null;
if (this.pages.length == 0) {//no pages
this.goToScan();
return;
} else {
setTimeout(() => {
this.goToSlide(this.pages.length - 1);
}, 500);
}
this.changeDetector.detectChanges();
}
catch (err) {
console.log(err);
}
}
pipe.ts
import { Pipe, PipeTransform } from '@angular/core';
import { ImageHandlingProvider } from '../../providers/image-handling/image-handling';
import { Page } from 'cordova-plugin-scanbot-sdk';
@Pipe({
name: 'normalizeUri',
})
export class NormalizeUriPipe implements PipeTransform {
constructor(private imageHandlingProvider: ImageHandlingProvider) { }
transform(pages: Page[]): string[] {
return pages.map((p) => {
return this.imageHandlingProvider.normalizeImageFileUri(p.documentPreviewImageFileUri || p.originalPreviewImageFileUri);
});
}
}
答案 0 :(得分:1)
您必须为此使用impure
管道
@Pipe({
name: 'normalizeUri',
pure: false
})
但是不纯净的管道使用不可靠。
答案 1 :(得分:0)
您已经创建了所谓的“纯管道”。如果未指定类型,则为默认值。仅当“检测到输入值发生纯更改时,才执行纯管道。纯更改是对原始输入值(字符串,数字,布尔值,符号)的更改或对象引用的更改” (日期,数组,函数,对象)。” (Angular Manual)
要使管道不纯,请将false标志添加到管道装饰器中:
@Pipe({
name: 'normalizeUri',
pure: false
})
由于Pure管道经常执行,因此通常不建议使用。 经常调用不纯管道,就像每次击键或鼠标移动一样。(Angular Manual)
相反,在将URI分配给将在模板中呈现的对象之前,请考虑对其进行规范化。