angular:如何循环数字?

Moh*_*mad 13 ngfor angular

我有一个项目集合,其中每个项目都有一个rank属性,这是一个数字.我想循环这个数字,这是我尝试过的:

<div class="col-md-3 col-sm-4 item-container" *ngFor="let item of items">
    <div class="item">
        <p class="rank">
            <img src="" class="img-responsive" *ngFor="let rank of item.rank"/>
        </p>
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

打字稿:

export class MonthpicksComponent{

    items: Item[] = [];
    //...
}

export class Item{
  id: number;
  name: string;
  img: string;
  desc: string;
  rank: number;
  voters: number;
}
Run Code Online (Sandbox Code Playgroud)

但不幸的是,第一个循环只显示一个结果而第二个循环没有显示任何结果.

小智 26

也许是没有任何TS代码的最简单的解决方案:

<div *ngFor="let item of [].constructor(10); let i = index">
   {{i}}
</div>
Run Code Online (Sandbox Code Playgroud)

  • 为什么这不是首选解决方案,因为这显然是我们大多数人的想法?就像——它确实需要一个临时数组来循环,但在这种情况下生成没有单行打字稿。荣誉! (6认同)

Wit*_*zyk 17

你可以在里面使用函数,*ngFor所以解决方案应该是这样的:

my.component.ts

counter(i: number) {
    return new Array(i);
}
Run Code Online (Sandbox Code Playgroud)

my.component.html

<li *ngFor='let in of counter(5) ;let i = index'>{{i}}</li>
Run Code Online (Sandbox Code Playgroud)

  • 当然可以,但我的印象是,在 Angular 模板中执行任意函数或代码是一种巨大的反模式,因为 Angular 无法确定代码是纯净的还是不纯净的。这就是管道的用途。 (3认同)
  • 因为这是一个不纯粹的调用,所以不会在每次检查时重建吗? (2认同)

Wou*_*ens 8

如果您想以规范的 Angular 方式实现这一点,您可以创建一个range管道,当场生成数组。

import {Pipe, PipeTransform} from '@angular/core';

@Pipe({
  name: 'range'
})
export class RangePipe implements PipeTransform {
  transform(length: number, offset: number = 0): number[] {
    if (!length) {
      return [];
    }
    const array = [];
    for (let n = 0; n < length; ++n) {
      array.push(offset + n);
    }
    return array;
  }
}
Run Code Online (Sandbox Code Playgroud)

然后你会在这样的模板中使用它:

<ul>
  <li *ngFor="let n of item.rank | range">
    <img src="star.png">
  </li>
</ul>
Run Code Online (Sandbox Code Playgroud)

当然,当您不希望数组从 0 开始时,偏移参数很有用。

这种方法的一个巨大优势是这是一个纯管道,这意味着它只会在 item.rank 更改时执行。其他方法可能会在任意页面检查阶段(可能每秒多次)进行虚假更新。

  • 不知道为什么这没有更多的赞成票。当通过 @Input() 将数字传递到我的组件时,这里描述的所有其他方式都会在我的模板中留下“无效的数组长度”错误。这是唯一对我有用的事情。 (3认同)
  • 我很高兴能帮上忙!我的答案相当新,也许这就是它排名不高的原因。我确信这是最有 Angular 精神的解决方案。 (2认同)

GMK*_*ain 6

有对象

.TS文件

page = {
  count: 3
}
Run Code Online (Sandbox Code Playgroud)

HTML 文件

 <div *ngFor="let item of [].constructor( page.count ); let i = index">
   index: {{i}} | other content...
 <div>
Run Code Online (Sandbox Code Playgroud)


小智 5

你可以这样做

<li *ngFor='let in of [0,1,2,3,4];let i = index'>{{i}}</li>
Run Code Online (Sandbox Code Playgroud)

  • 您不需要 let i = index 因为您的数组已经具有相同的值。 (3认同)