在 php 中有可能有条件地关闭 html 标签。我们可以在 Angular 2 中模拟类似的东西吗?
例如
<p>
Some lorem
<?php if(someConditionTrue){ echo "</p>"}; ?>
在 php 中有可能有条件地关闭 html 标签。我们可以在 Angular 2 中模拟类似的东西吗?
例如
<p>
Some lorem
<?php if(someConditionTrue){ echo "</p>"}; ?>
即使它有效,也可能有更好的解决方案,请参阅下面的注释。
组件脚本:
private items: string[] = ['test1','test2','test3','test4','test5','test6','test7','test8','test9'];
的HTML:
<div *ngFor="let item of items; let i = index">
<div class="row" *ngIf="i%4==0">
<div *ngIf="items[i]">{{items[i]}}</div>
<div *ngIf="items[i+1]">{{items[i+1]}}</div>
<div *ngIf="items[i+2]">{{items[i+2]}}</div>
<div *ngIf="items[i+3]">{{items[i+3]}}</div>
</div>
</div>
https://plnkr.co/edit/RDZFJFEZtTD0NA5d8YNJ?p=preview
注意:创建数组(项目)的数组(行)而不是使用我发布的“仅模板”解决方案可能会更好。
对于有 PHP 经验的开发人员来说,这是一种常见的挫败感,而不是拒绝 Angular 或任何其他框架(例如 Ionic)。不幸的是,您不能*ngIf
在关闭 HTML 标记上放置条件,并且当您将条件放在开头<div>
时,您将有条件地排除 INSIDE 内的所有内容,<div>
而不仅仅是您要定位的标记。
因此,最后,您的代码将是相当多余的,但您可以像这样解决问题:
<div class="iterable-container">
<div *ngFor="let item of items; let i = index">
<div class="iterable-col-1" *ngIf="(i+3) % 3 == 0">
<p>first column: {{item.name}}</p>
</div>
<div class="iterable-col-2" *ngIf="(i+3) % 3 == 1">
<p>second column: {{item.name}}</p>
</div>
<div class="iterable-col-3" *ngIf="(i+3) % 3 == 2">
<p>third column: {{item.name}}</p>
</div>
</div>
</div>
您还需要一些 CSS。这是一些启动器:
.iterable-container {
background-color: #f2f2f2;
}
.iterable-col-1 {
display: flex;
height: 175px;
}
.iterable-col-2 {
display: flex;
height: 0;
left: 33%;
position: relative;
top: -175px;
}
.iterable-col-3 {
display: flex;
height: 0;
left: 66%;
position: relative;
top: -175px;
}
<div>
考虑放弃这些标签以获得良好的老式 HTML也可能是值得的<table>
。她可能已经过时了,但我觉得她几乎就是为此而生的。
当我尝试以响应方式在 3 列上显示数据时遇到了这个问题。我必须在 3 列中显示的数据是具有不同高度的框(实际上它们是 mat-expansion-panel)。我首先尝试使用 Angular 的 flex,但这并不好,因为我在盒子之间(底部和顶部)有空格。通过使用来自 Angular 的引导程序,我终于发现了一个运行良好的布局。我有一个动态数量的框,必须显示在 3 列中。最后它应该或多或少看起来像这样(例如 9 个盒子)。
<div class="container-fluid">
<div class="row justify-content-start">
<div class="col-12 col-lg-4">
<box1></box1>
<box1></box1>
<box1></box1>
</div>
<div class="col-12 col-lg-4">
<box1></box1>
<box1></box1>
<box1></box1>
</div>
<div class="col-12 col-lg-4">
<box1></box1>
<box1></box1>
<box1></box1>
</div>
</div>
</div>
我的第一个想法是在 <div class="row 上放置一个 ngFor 以便遍历所有框,但问题是......我如何使 <div class="col-12 col-lg-4每 3 个盒子出现一次?我使用了这篇文章的一些帮助,在谷歌上寻找了一整天的解决方案,但我没有找到任何解决方案。最后,我提供了以下解决方案,适用于任意数量的盒子。
<div class="container-fluid">
<div class="row justify-content-start">
<div class="col-12 col-lg-4">
<ng-container *ngFor="let cat of categoryProducts; let i = index">
<box1 *ngIf="i%4 == 0">{{cat.name}}</box1>
<ng-container
</div>
<div class="col-12 col-lg-4">
<ng-container *ngFor="let cat of categoryProducts; let i = index">
<box1 *ngIf="i%4 == 1">{{cat.name}}</box1>
<ng-container
</div>
<div class="col-12 col-lg-4">
<ng-container *ngFor="let cat of categoryProducts; let i = index">
<box1 *ngIf="i%4 == 2">{{cat.name}}</box1>
<ng-container
</div>
</div>
</div>
解释是这样的。示例:假设我们有一个 categoryProducts 数组。这些将具有以下索引 [0, 1, 2, 3, 4, 5, 6, 7, 8]。如您所见,该解决方案将在同一个阵列上循环 3 次(有点多余但没关系)。在第一个循环中,我们将仅考虑具有以下索引的元素:0、3、6。其他元素将被忽略,但将在接下来的 2 个循环中考虑。在第二个循环中,我们将只考虑具有以下索引的元素:1、4、7。其他的将被忽略。在第三个循环中,我们将只考虑具有这些索引的元素:2、5、8。其他的将被忽略,但已经显示在其他循环中。box1 可以是您需要的每个元素:div、mat-expansion-panel、组件等。该示例有 3 列,但您可以将其用于任意数量的列。就我而言,我需要 4 个。这适用于任意数量的盒子。所有这些都将分为 3 列。
我之前的回答假设您需要为每一列提供不同的内容(由文本“第一”、“第二”、“第三”表示)。
Simon Aronsson是正确的,这违反了框架。如果您只需要样式一致的内容的行和列,您可以简化如下:
<div class="iterable-container">
<div *ngFor="let item of items">
<div class="iterable-col of-3">
<p>{{item.name}}</p>
</div>
</div>
</div>
我使用.of-2
和.of-3
类将类似的体系结构应用于 2-col 和 3-col 视图。一些入门 Sass:
// assumes you have a color map:
.iterable-container {
background-color: color($colors, light);
}
.iterable-col {
display: flex;
position: relative;
float: left;
clear: right;
}
// first column
.iterable-col {
&.of-2:nth-of-type(2n+1){
width: 50%;
max-height: 300px; // depending on size of your card
}
&.of-3:nth-of-type(3n+1){
width: 33.33%;
}
}
// 2nd of 3 columns
.iterable-col.of-3:nth-of-type(3n+2){
width: 33.33%;
}
// last column
.iterable-col{
&.of-2:nth-of-type(2n){
width: 50%;
max-height: 300px;
}
&.of-3:nth-of-type(3n){
width: 33.33%;
}
}
你为什么需要这个?看起来你正在反对框架而不是拥抱它。
有几种方法可以做类似的事情,比如 ng-if、ng-repeat 和 ng-show。
一种方法是:
<p>
<span ng-show='condition' ng-repeat='item in collection'>
{{item.Text}}
</span>
</p>