Javascript 为什么数组的功能像';过滤器';和';地图';不';t在'工作;ngFor';角的表达式?

Javascript 为什么数组的功能像';过滤器';和';地图';不';t在'工作;ngFor';角的表达式?,javascript,arrays,angular,ngfor,Javascript,Arrays,Angular,Ngfor,在使用角度模板时,我发现数组函数(如)与ngFor指令表达式(如follow)配合使用非常好 <div *ngFor="let item of arry.slice(3)"> {{ item.name }} </div> <div *ngFor="let item of arry.filter(i => i.marks > 40)"> {{ item.name }} </div> 它给了我一个角度模板解析错误 区域:;任务:

在使用角度模板时,我发现数组函数(如)与
ngFor
指令表达式(如follow)配合使用非常好

<div *ngFor="let item of arry.slice(3)">
  {{ item.name }}
</div>
<div *ngFor="let item of arry.filter(i => i.marks > 40)">
  {{ item.name }}
</div>
它给了我一个角度模板解析错误

区域:;任务:承诺;值:错误:模板分析错误:
分析器错误:绑定不能在[arry.filter的let项(i=>i.marks>40)]的第25列包含赋值。


为了理解这些行为背后的原因,我试图找出一些解释这些限制的文件,但没有找到。任何线索或解释将不胜感激

如注释中所述,Angular对模板中允许的表达式类型有很大的限制。这有很好的理由:例如,涉及函数调用的复杂表达式不能很好地用于更改检测。记住,这些表达式实际上不是JavaScript/TypeScript;它们仅仅是JavaScript-类似于

如果你真的想在模板中进行过滤,那么

<div *ngFor="let item of arry">
  <ng-container *ngIf="item.marks > 40">
    {{ item.name }}
  </ng-container>
</div>

{{item.name}
另一种选择是编写一个管道来进行过滤。然而,Angular团队也建议不要这样做

通常,更复杂的逻辑可以也应该写入组件的TS逻辑中

顺便说一下,对于
切片
,建议使用。Angular将能够比
.slice()
更好地对此进行优化


有些相关:。

不是所有的typescript表达式都可以在angular模板中使用,例如,创建一个新的匿名函数在所有浏览器上都会失败吗?是的,这是一个模板错误。这是绝对不允许的。这不是一个浏览器限制我从这里开始阅读:我喜欢使我的模板尽可能简单,并在TypeScript代码中执行所有业务逻辑。@Skeptor,它无法解析该文本,并且认为等号是一个赋值。“…另一种选择是编写一个管道来进行过滤。然而,Angular团队也建议不要这样做。。。“这是否意味着ppl不应该使用管道?另外,在文档中我在哪里可以找到它?不,这意味着你不应该使用管道进行排序和过滤。看,这是一个很好的资源,我不知道使用管道来达到这些目的是一种不好的做法。谢谢你的链接如果我制作一个纯粹用于过滤的定制管道呢?为什么它一定是不纯洁的?