【问题标题】:angular: how to loop for numbers?角度:如何循环数字?
【发布时间】:2018-03-30 01:00:57
【问题描述】:

我有一个项目集合,其中每个项目都有一个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>

打字稿:

export class MonthpicksComponent{

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

export class Item{
  id: number;
  name: string;
  img: string;
  desc: string;
  rank: number;
  voters: number;
}

但不幸的是,第一个循环只显示了一个结果,而第二个循环什么也没显示。

【问题讨论】:

  • 您可能需要为items 对象的外观添加代码。 Html 不足以解决这个问题。
  • @Sajal 请检查更新
  • 在控制器@mohammad 中提供项目结构
  • 如果数字不是数组,则不能循环。 rank 是一个数字。
  • 这里是高频问题,请参考:stackoverflow.com/questions/36535629/…

标签: angular ngfor


【解决方案1】:

有对象

TS 文件

page = {
  count: 3
}

HTML 文件

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

【讨论】:

    【解决方案2】:

    试试这个

    <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"/>{{item.rank}}
        </p>
      </div>
    </div>
    

    【讨论】:

      【解决方案3】:

      我知道这个问题已经 3 年了,并且已经得到解答,但我有类似的需求,我对如何解决它并不完全满意。所以我创建了一个专门的结构指令来处理这些情况。

      我发布了ngx-range,让您可以编写如下内容:

      <ul>
        <li *ngxRange="let value from 0 to 20 by 5">
          Item #{{value}}
        </li>
      </ul>
      

      当然,每个值都可以是一个变量,比如

      export class AppComponent {
        start = 0;
        end = 5;
        step = 1;
      }
      
      <ul>
        <li *ngxRange="let value from start to end by step">
          Item #{{value}}
        </li>
      </ul>
      

      【讨论】:

        【解决方案4】:

        如果您想以规范的 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;
          }
        }
        

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

        <ul>
          <li *ngFor="let n of item.rank | range">
            <img src="star.png">
          </li>
        </ul>
        

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

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

        【讨论】:

        • 不知道为什么这没有更多的赞成票。当通过@Input() 将数字传递到我的组件时,此处描述的所有其他方式都会在我的模板中留下Invalid array length 错误。这是唯一对我有用的东西。
        • 很高兴能为您提供帮助!我的答案相当新,也许这就是它排名不高的原因。我确信这是最具 Angular 精神的解决方案。
        • 这是最优化的解决方案!谢谢你的分享。我没有意识到这实现起来有多么简单。
        【解决方案5】:

        您可以在 *ngFor 中使用 javascript,因此解决方案可能如下所示:

        my.component.ts

        counter(i: number) {
            return new Array(i);
        }
        

        my.component.html

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

        【讨论】:

        • 不是每次检查都会重建吗,因为这是一个不纯的调用?
        • 我不这么认为,也许吧。很容易检查。该答案的重点是您可以从*ngFor body 执行js代码。其余的答案只是一个例子。确实有成千上万种方法可以做到这一点。
        • 当然,但我的印象是,在 Angular 模板中执行任意函数或代码是一种巨大的反模式,因为 Angular 无法确定代码是纯代码还是不纯代码。这就是管道的用途。
        【解决方案6】:

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

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

        【讨论】:

        • 为什么这不是首选解决方案,因为这显然正是我们大多数人的想法?就像 - 它确实需要一个临时数组来循环,但在这种情况下生成时没有单行打字稿。赞一个!
        【解决方案7】:

        最简单的方法是在 .ts 文件中定义一个数组

        i = Array
        count : number = 3
        

        您可以动态更改任何函数中的值

        在模板中,循环可以包含如下

         <div *ngFor="let j of i(count)">
            // Loop content here
         <div>
        

        【讨论】:

          【解决方案8】:

          对于您的特定用例,您可以使用以下代码:

          HTML:

          <div *ngFor="let i of arr(item.rank)"> // arr is declared as Array in our .ts file
             <img src="" class="img-responsive"
          </div>
          

          .ts:

          export class SomeComponent {
            arr = Array; // declaring arr as Array
          }
          

          arr 将接受您的 rank 属性值并创建一个该长度的数组,然后您可以轻松地循环您的值所代表的次数。

          试试这个代码希望它会有所帮助。

          【讨论】:

            【解决方案9】:

            你可以这样做

            <li *ngFor='let in of [0,1,2,3,4];let i = index'>{{i}}</li>
            

            【讨论】:

            • 你不需要 let i = index 因为你的数组已经有相同的值了。
            • &lt;li *ngFor='let i of [0,1,2,3,4]&gt;{{i}}&lt;/li&gt; 更简单
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-03-02
            • 2016-10-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-02-05
            相关资源
            最近更新 更多