随机加载图像数组

Load array of images at random

我开发了一个小图片库。我打算有两个不同的数组,一个数组名称和一个图像数组。

加载数组名称时,会创建多个 "squares",其中包含图像的名称和 src。

有没有办法在 "squares" 中放置随机图像并在其中保留名称数组?

DEMO - STACKBLITZ

HTML

<ul class="mdc-image-list my-image-list">
    <li class="mdc-image-list__item" *ngFor="let cat of names">
        <div class="mdc-image-list__image-aspect-container">
            <img [src]=""
              class="mdc-image-list__image imagelistCatalog">
          </div>
            <div class="mdc-image-list--with-text-protection">
                <div class="mdc-image-list__supporting supportingCatalog">
                    <span class="mdc-image-list__label textLabelCatalog">{{cat.name}}</span>
                </div>
            </div>
    </li>
</ul>

TS

names=[
  {
   name:"name1"
},
  {
     name:"name1"
},
  {
     name:"name1"
},
  {
     name:"name1"
}]

images=[
  {
   img:"https://material-components-web.appspot.com/images/photos/3x2/6.jpg"
},
  {
     img:"https://material-components-web.appspot.com/images/photos/3x2/5.jpg"
},
  {
     img:"https://material-components-web.appspot.com/images/photos/3x2/3.jpg"
},
  {
     img:"https://material-components-web.appspot.com/images/photos/2x3/2.jpg"
}]

// Component.ts file
 newArr = []
 ngOnInit(): void {
    for(var i = 0 ; i < this.names.length; i++){
      this.newArr[i] = {};
      this.newArr[i]['name'] = this.names[i].name;
      this.newArr[i]['img'] = this.imgRand();
    }
 }
 
 imgRand(){
    let img = this.images[Math.floor(Math.random() *    this.images.length)];
    return img.img;
 }
 <li class="mdc-image-list__item" *ngFor="let cat of newArr">
  <div class="mdc-image-list__image-aspect-container">
    <img [src]="cat.img" class="mdc-image-list__image imagelistCatalog">
  </div>
  <div class="mdc-image-list--with-text-protection">
    <div class="mdc-image-list__supporting supportingCatalog">
      <span class="mdc-image-list__label textLabelCatalog">{{cat.name}}</span>
    </div>
  </div>
</li>

在您的 component.ts 文件中创建一个新函数,从您的图像数组中 returns 一个随机图像名称。

在您的 component.html 文件中,在 img src 调用新函数 ... img [src]="yourFunctionName()"。这会起作用,但这样做可能会在您的控制台中生成 ExpressionChangedAfterItHasBeenCheckedError。

我建议您创建一个新数组,并在 ngOnInit 生命周期方法中循环遍历名称数组,使用键 'name' 和 'image' 创建一个新对象(使用你的新随机函数),将它推送到你的新数组并在你的 component.html 文件中使用 *ngFor 代替。

我建议创建一个数组 "order" 并迭代顺序,有些像

order:number[]

ngOnInit()
{
  this.order=this.images.map((n,index)=>index); //create an array [0,1,2,3..]
  this.order.sort((a,b)=>Math.random()>.5);  //shuffle the array
}

然后使用

<li class="mdc-image-list__item" *ngFor="let index of order">
   {{images[index]}}{{names[index]}}
</li>

注意:如果您使用一个对象数组而不是两个数组,您可以改进应用程序。例如如果你有

images=[{img:"...",name:".."},{img:"...",name:".."},{img:"...",name:".."}..]

并使用

<li class="mdc-image-list__item" *ngFor="let index of order">
   {{images[index].img}}{{images[index].name}}
</li>

stackblitz