【问题标题】:Save variables in ngFor loop, that result out of an item将变量保存在 ngFor 循环中,结果从项目中取出
【发布时间】:2018-01-11 05:34:12
【问题描述】:

我很好奇,在*ngFor 循环中保存一个变量的正确方法是什么,导致一个项目,因为出于效率原因,我不想多次调用一个函数

我正在尝试做的示例:

<div *ngFor="let item of items; let i = index; let value = getValue(item)" [ngClass]="{'alert':!value}">
  <div *ngIf="!value">
    alert
  </div>
  {{item}}
</div>

我试图避免的例子:

<div *ngFor="let item of items; let i = index;" [ngClass]="{'alert':!getValue(item)}">
  <div *ngIf="!getValue(item)">
    alert
  </div>
  {{item}}
</div>

【问题讨论】:

  • 你能包含你的getValue函数吗?

标签: angular loops variables typescript ngfor


【解决方案1】:

将您的items 放入map 函数中,并为每个项目返回正确的值。

function valueize(items: any[]): any[] {
    return items.map(item => {
        name: item.name,
        description: item.description,
        // etc...
    };
}

<div *ngFor="let item of valueize(items); let i = index;" [ngClass]="{'alert':!item}">
  <div *ngIf="!item">
    alert
  </div>
  {{item}}
</div>

您可能希望在调用 *ngFor 之前执行此操作,因此您可以执行 *ngFor="let item of items" ,其中 items 中的每个 item 已经是正确的值。例如,您可以在构造函数或 ngOnInit 中执行此操作。

编辑:

正如 ChrisG 所提到的,如果您已经拥有 getValue 函数,则可以通过执行以下操作来使其更简洁:

<div *ngFor="let item of items.map(getValue); let i = index;" [ngClass]="{'alert':!item}">
  <div *ngIf="!item">
    alert
  </div>
  {{item}}
</div>

这样您不必创建一个全新的函数来映射,您只需映射内联并为每个项目调用适配器函数,从而为每个item 赋予正确的值。

【讨论】:

  • 如果他们已经有了getValue 函数,他们可以更简单地内联它。 *ngFor="let item of items.map(getValue); let i = index"
  • 又好又干净!
【解决方案2】:

没有办法做你想做的事。

您唯一能做的就是创建一个数组,将值存储在数组中,然后使用索引获取它们。有点像...

let data = [];
.
.
.
<div *ngFor="let item of items; let i = index" ngClass="{'alert':!data[i]}">
{{ data[i] = getValue(item) }}
  <div *ngIf="!data[i]">
    alert
  </div>
  item
</div>

并且仍然不确定它是否会起作用,Angular 不适合这种东西,在将它们推送到循环之前简单地解析你的值要容易得多,比如 ...

<div *ngFor="let value of getItemValues(items); let i = index" [ngClass]="{'alert':!value}">
  <div *ngIf="!value">
    alert
  </div>
  {{value}}
</div>

getItemValues() 将一次性解析所有值。

【讨论】:

  • “没有办法做你想做的事”是一个无效的陈述。此外,您的代码不是很容易阅读。在模板中执行{{ data[i] = getValue(item) }} 之类的操作并不是一个很好的做法,因为有更好的选择,例如在循环之前准备好数据等等。
  • “没有办法做你想做的事”在当前上下文中是一个完全有效的陈述,因为数据操作不可能以他想要的方式进行。另外,如果您看不懂,我确实说过在循环之前准备数据是一个更好的选择,但也有其他选择,可能不是最佳但可能。
  • 感谢您的更新,我没有阅读您的文字,仅阅读了代码。无论如何,你不应该说“没有办法做你想做的事”,因为正如我所说的那样一个无效的陈述。你可以通过我们已经描述的方式实现他想要做的事情,因此有一个方法。所以,也许可以说“没有办法在 *ngFor 中做你想做的事”。您的原始陈述对我们这些略读的人非常具有误导性。当然,略读是我们自己的错。但大多数人没有时间浪费时间阅读整段文字,宁愿立即看到明确的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-04
  • 1970-01-01
  • 1970-01-01
  • 2018-10-06
  • 1970-01-01
  • 2018-08-12
相关资源
最近更新 更多