【问题标题】:Angular7+, *ngFor X amount of items per row, best practiceAngular7+,*ngFor 每行 X 数量的项目,最佳实践
【发布时间】:2019-06-12 12:25:25
【问题描述】:

几个月前我开始在我的项目中使用 Angular,我需要一些建议。

我正在使用 Bootstrap4,我需要为存储在数组中的每 3 个项目创建一行。该数组具有动态大小,因此如果我的数组有 21 个项目,我需要创建 7 行,每行 3 个项目。

我发现了很多关于这个主题的问题,但我不知道使用哪种解决方案。

迄今为止最好的解决方案:

  1. 使用多个 ngIf*: https://riptutorial.com/angular2/example/32251/-ngfor-x-amount-of-items-per-row
  2. 将原始数组拆分为多维数组,使用*ngFor 2次: https://medium.com/@miki995/angular-6-bootstrap-4-row-columns-same-height-8be5bdb53099

有人使用了解决方案吗?还是最新版本的 Angular 引入了更好的东西?

提前致谢!

【问题讨论】:

  • 您的问题是什么?您想要每行包含 3 个项目吗?只需为每个项目使用col-4
  • 我会调整我的问题,但如果我的数组中有 21 个项目。我想为每 3 个项目创建一个新行。
  • 再次,只需为每个项目使用col-4bootply.com/o7m8Xv0eiA
  • 如果我理解正确,你有一个动态大小的数组,比如说:["1", "2", "3", "4", "5"],你想在一个有 3 列权限的表中显示这个数组?
  • @Eastrall,是的。在您的情况下,一行将有 1, 2 , 3 和第二行: 4, 5

标签: angular bootstrap-4 angular7


【解决方案1】:

您可以使用 lodash 创建一个元素数组,该数组按照大小的长度分成组。 _.chunk(array, [size=1])

或者使用

let arr = [1,2,3,4,5,6,7,8];
let chunk_size = 3; //no. of elements you want to print in single row
let chunkArray = arr.map(function(e, i) {
return i % chunk_size === 0 ? arr.slice(i, i + chunk_size) : null;
})
.filter(function(e) {
return e;
});


<div class="row" *ngFor="let data of chunkArray ">
<div class ="col-md-4" *ngFor="let item of data">
{{item.name}}
</div>
</div>

【讨论】:

    【解决方案2】:

    所以基本上,你有一个动态大小的数组,比如说:["1", "2", "3", "4", "5"]。 您真正想要做的是,以某种方式拥有一个包含一个或多个 N 值数组的数组,例如:[["1", "2", "3"], ["4", "5"]]

    为此,您可以使用这个sn-p:

    function groupArray<T>(data: Array<T>, n: number): Array<T[]> {
        let group = new Array<T[]>();
    ​
        for (let i = 0, j = 0; i < data.length; i++) {
            if (i >= n && i % n === 0)
                j++;
            group[j] = group[j] || [];
            group[j].push(data[i])
        }
    ​
        return group;
    }
    

    现在,要使用它,只需像这样调用它:

    var arrayOfData: string[] = ["1", "2", "3", "4", "5"];
    var group = groupArray(arrayOfData, 3);
    
    console.log(group); // displays: ["1", "2", "3"], ["4", "5"]
    

    在 Angular 中,您现在可以在 group 数组上创建一个 *ngFor 来构建行,然后再创建一个 *ngFor 来构建列。 请注意最后一个数组,根据原始数组的大小,您可能没有正确的长度。您将需要使用空值或任何您想要的“完成”最后一个数组。

    希望对你有帮助。

    【讨论】:

    • Eastral,对于打字稿,将“var”替换为“let”并删除函数中的“function”
    • 是的。这是一个解决方案。这与我的问题中的第 2 点类似。我会告诉你我是否会使用这种方法。
    【解决方案3】:

    我的建议是使用不同的方法。如果您使用bootstrap flexbox Wrap,并且宽度固定,您仍然可以使用单个*ngFor,结果将在每 3 个项目后生成“换行符”(如果您强制它连续容纳 3 个项目) .

    所以是这样的:

    <div class="d-flex flex-wrap" style="width: 300px">
      <div *ngFor="let item of myArrayOfItems style="width: 10px">
      ...
      </div>
    </div>
    

    这样就可以更轻松地为未来可能的更短行扩展功能(例如在响应式、适合移动设备的 UI 中)

    【讨论】:

    • 这很有趣。但是对于固定宽度我不知道该说什么。
    • 它更适合这个问题,我相信你仍然可以使用宽度百分比。
    • 你试过这个百分比的解决方案吗?
    • 它无法按我的意愿工作。我会选择解决方案 1
    猜你喜欢
    • 1970-01-01
    • 2012-05-22
    • 2021-11-15
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-26
    相关资源
    最近更新 更多