Ionic 2 Angular 4 中出现错误条件的回退图像

Fallback image with condition on error in Ionic 2 Angular 4

我有一个包含图像源的标签。如果图像失败,我还写了一个错误案例。下面是我的代码

<div class="column thumbnail"><img class="posterThumbNail" [src]="item.imageUrl" onError="this.src='./assets/imgs/placeholder.png';" /></div>

我能否在此 onError 中设置条件,以便根据缩略图类别显示与该类别相关的不同占位符图像。期待类似的东西,

<div class="column thumbnail"><img class="posterThumbNail" [src]="item.imageUrl" onError="errorPlaceHolder" /></div>

<ng-template #errorPlaceHolder>
 <div [ngSwitch]="item.category">
    <template [ngSwitchCase]="foo">
        <div>./assets/imgs/placeholderFoo.png</div>
    </template>
    <template [ngSwitchCase]="bar">
        <div>./assets/imgs/placeholderBar.png</div>
    </template>
    <template [ngSwitchCase]="cat">
        <div>./assets/imgs/placeholderCat.png</div>
    </template>¯
    <template [ngSwitchCase]="dog">
        <div>./assets/imgs/placeholderDog.png</div>
    </template>
</div>
</ng-template>

我知道上面的代码在语法上是不正确的。我正在寻找与我上面的代码片段相匹配的解决方案。谢谢

你可以有一个 ts 端变量来设置 errorPath。

errorPaths:string[]=[];

//set the path wherever you receive item
switch(item.category){
  //set the path for each case in loop

}

在您的 html 文件中,

 <div ngFor="let item of items;let i=index">
    <div class="column thumbnail"><img class="posterThumbNail" [src]="item.imageUrl" [onError]="errorPaths[i]" /></div>
</div>

您应该使用 (error) 事件来处理错误,根据 您可以使用对象来显示后备图像

HTML:

  <div *ngFor="let item of items">
  ...

  <img *ngIf="!item.fallbackUrl" class="posterThumbNail" [data]="item.imageUrl" (error)="handleError(item)" />

  <img *ngIf="item.fallbackUrl" class="posterThumbNail" [src]="item.placeHolder" />

  ...

  </div>

控制器:

handleError(item: any) {
  switch (item.category) {
    case "foo":
      item.fallbackUrl = './assets/imgs/placeholderFoo.png';
      break;
    case "bar":
      item.fallbackUrl = './assets/imgs/placeholderBar.png';
      break;
    default:
  }

}

您也可以反转逻辑,仅在加载主图像时才替换占位符。这可以通过 ngif 和 (load) 来完成。另外,如何将逻辑放在 class 而不是模板中?更容易调试? 它可以在附加阵列的帮助下完成,以跟踪加载的图像。该数组可以与原始数组合并,具体取决于您如何获取它以及如何管理它。

Class:

loaded = [false, false, false]; // should have items length
...
getReplacementImage(category) {
switch (category) {
  case "dog":
    return "dogImage";
  case "cat":
    return "catImage"
  default:
    return "placeholderImage"
}

Html:

<... *ngFor="let item of items; let i = index">

    <img [class.image-error]="!loaded[i]" ... [src]="item.image" (load)='loaded[i]=true'>

    <img *ngIf="!loaded[i]" ... [src]="getReplacementImage(item.category)">

</...>

CSS:

.image-error {
  display:none; // to hide the placeholder image
}

DEMO