首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

当列表更新时,Angular *ngFor不是反应性的

基础概念

Angular 的 *ngFor 是一个内置指令,用于在模板中迭代数组,并为每个数组项创建一个子元素。它是响应式的,意味着当绑定的数组发生变化时,视图应该自动更新。

相关优势

  • 响应式*ngFor 自动跟踪数组的变化,并更新 DOM。
  • 简洁:使用模板语法,代码简洁易读。
  • 灵活性:可以轻松地添加、删除或修改数组中的项。

类型

*ngFor 支持两种类型的迭代:

  1. 简单迭代:直接迭代数组中的项。
  2. 简单迭代:直接迭代数组中的项。
  3. 索引迭代:同时获取数组项及其索引。
  4. 索引迭代:同时获取数组项及其索引。

应用场景

*ngFor 广泛应用于需要动态生成列表的场景,例如:

  • 显示用户列表
  • 展示商品列表
  • 列表项的增删改查操作

可能遇到的问题及解决方法

问题:当列表更新时,Angular *ngFor 不是反应性的

原因

  1. 数组变化检测问题:Angular 的变更检测机制可能没有检测到数组的变化。
  2. 对象引用问题:如果数组中的对象是引用类型,直接修改对象的属性可能不会触发变更检测。

解决方法

  1. 使用 trackBy 函数
  2. 使用 trackBy 函数
  3. 使用 trackBy 函数
  4. 使用 sliceconcat 方法: 如果你需要修改数组中的元素,可以使用 sliceconcat 方法来创建一个新的数组,从而触发变更检测。
  5. 使用 sliceconcat 方法: 如果你需要修改数组中的元素,可以使用 sliceconcat 方法来创建一个新的数组,从而触发变更检测。
  6. 使用 ChangeDetectorRef: 手动触发变更检测。
  7. 使用 ChangeDetectorRef: 手动触发变更检测。
  8. 使用 NgZone: 确保在 Angular 的变更检测范围内执行代码。
  9. 使用 NgZone: 确保在 Angular 的变更检测范围内执行代码。

参考链接

通过以上方法,你应该能够解决 *ngFor 不是反应性的问题。

相关搜索:当列表更新时,Angular *ngFor没有反应仅当单击按钮时才反应更新状态,而不是在输入中写入内容时进行更新通过fetch方法获取时,组件的数据属性不是反应性的当更新数据帧的字典列表的给定字典列表时无行当在angular2中悬停ngfor的单个列表元素时,如何显示图片?Angular 8,当一个下拉列表被选中,另一个被选中时,我如何创建一个反应性?当GET返回null而不是列表时,KotlinxSerializer处的NullPointerException当数据被追加到现有数组中时,*ngFor在Angular中是如何工作的?当数据不是周期性的时,如何绘制基于堆叠的条形图当列表不是唯一的子级时,NavigationLink保持突出显示当使用angular调用click函数时,如何更新循环内的get函数?当使用CdkDragDrop从特定的droplist拖动时,如何更新Angular中的变量?当从函数返回反应值时,值似乎不是反应值。(错误:无法将“closure”类型强制为“character”类型的向量)当IN是实际的值列表(而不是查询)时,SQL - JOIN与IN的性能Angular 4:列表在替换支持数组中的项时不更新当更新表时显示im更改触发器内的值,而im不是当" in“运算符中的列表很大时,SQLAlchemy更新操作不起作用当ui.router是"home/“而不是"home”时,无法解析Angular URL中的状态。当所有元素都更改时,数组中对象的属性是反应性的,但如果只更改了部分元素,则不是这样当一个类在组件之外时,在Angular组件中使用/deep/的CSS专用性
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

LinkedList 不是列表,速度快兔子都追不上!

但当我们细看一下LinkedListclass定义,就会发现,它并不像是ArrayList那样具有纯洁列表精神。...这就意味着,DelayQueue中数据比较多时候,它性能就会下降。 除了把数据分片,使用多个DelayQueue来完成工作,我们有没有速度更快方法?...在延迟队列中数据增加,时间复杂度也能维持不变,可以说是速度快连兔子都追不上了。 一般,在java中,put和take方法,都是代表阻塞方法。...drainTo方法,可以一股脑把到期数据转移到其他集合中,但它并不是一个阻塞方法。 我们可以先使用take来阻塞线程,然后再批量取出所有数据。...,采用LinkedList来替代PriorityQueue,并进行批量操作后,CPU使用直接降低了1/3。

28030

AngularDart4.0 指南- 显示数据 顶

这些属性改变Angular更新显示。 更准确地说,重新显示是在与视图相关某种异步事件之后发生,例如按键,计时器完成或对HTTP请求响应。... 您使用AppComponent类(在web / main.dart中)引导Angular将在index.html中查找,查找它,实例化AppComponent...Angular使用该变量作为双曲花括号内插上下文。 在这种情况下,ngFor正在显示一个列表,但ngFor可以为任何Iterable对象重复项目。...现在英雄出现在一个无序列表中。 ? 为数据创建一个类 应用程序代码直接在组件内定义数据,这不是最佳实践。 但是,在一个简单演示中,没关系。 目前,绑定是一个字符串列表。...双引号内模板表达式,* ngIf =“heros.length> 3”,看上去和表现很像Dart。 组件英雄列表中有三个以上项目Angular会将该段落添加到DOM,并显示消息。

5.3K10
  • AngularDart4.0 指南- 模板语法二 顶

    模板表达式计算结果为trueAngular会添加类。 表达式为false,它将删除类。 <!...NgIf为falseAngular从DOM中删除元素及其后代。 它摧毁了他们组件,潜在地释放了大量资源,从而带来了更加快速用户体验。 展示/隐藏技术适合少数几个后代元素。...分配给* ngFor文本是指导迭代器进程指令。 *ngFor微语法 分配给* ngFor字符串不是模板表达式。 这是一种微语法 - Angular解释一种小语言。...例如,重新查询服务器可能会重置所有新英雄对象列表。 大多数,如果不是全部,以前显示英雄。 你知道这一点,因为每个英雄ID没有改变。 但是Angular只能看到新对象引用列表。...heroForm值是什么? heroForm是一个Angular NgForm指令引用,可以跟踪表单中每个控件值和有效。 原生元素没有form属性。

    30K20

    AngularDart 4.0 高级-结构指令 顶

    这些是两个NgFor输入属性名称。 这就是指令如何得知列表是heroes,并且track-by功能是trackById。 NgFor指令遍历列表,它会设置并重置其自己上下文对象属性。...两个指令声明相同宿主元素,哪一个优先? NgIf或NgFor应该先走哪一个? NgIf能否取消NgFor效果?...这是NgSwitchCase弃用名称。 分配给NgSwitch(hero.emotion)阀值确定显示哪些阀(如果有)。 NgSwitch本身不是一个结构指令。...NgSwitchCase值与switch值匹配,会显示它宿主元素。没有同级NgSwitchCase匹配switch,NgSwitchDefault显示它宿主元素。...结构指令使起作用,就像您在编写自己结构指令看到一样。 兄弟元素组 根元素通常能且应该成为结构指令宿主,列表元素()是NgFor迭代典型宿主元素。

    16.1K20

    Angular 显示英雄列表

    它会为列表每项数据复写它宿主元素。 在这个例子中  就是 *ngFor 宿主元素 heroes 就是来自 HeroesComponent 类列表。...依次遍历这个列表,hero 会为每个迭代保存当前英雄对象。 不要忘了 ngFor 前面的星号(*),它是该语法中关键部分。 浏览器刷新之后,英雄列表出现了。...主从结构 当用户在主列表中点击一个英雄,该组件应该在页面底部显示所选英雄详情。 在本节,你将监听英雄条目的点击事件,并更新英雄详情。...Angular 会把所点击  上 hero 对象传给它,这个 hero 也就是前面在 *ngFor 表达式中定义那个。...为什么这样是正常  selectedHero 为 undefined ,ngIf 从 DOM 中移除了英雄详情。因此也就不用担心 selectedHero 绑定了。

    4.4K70

    AngularDart 4.0 高级-管道 顶

    您使用管道Angular会选择更简单,更快速变更检测算法。  不使用管道 在下一个示例中,组件使用默认积极变化检测策略来监控并更新其hero列表中每个英雄显示。...如果你点击reset按钮,Angular用原有英雄列表替换heroes并更新显示。 如果您添加了删除或更改英雄功能,Angular会检测这些更改并更新显示。...您可以在实例(查看源代码)中确认,您添加英雄,即使您变更heroes列表,飞行英雄也会显示更新。 不纯AsyncPipe Angular AsyncPipe是一个不纯管道有趣例子。...Angular中没有等价物。 这不是一个疏忽。 Angular不提供这样管道,因为它们表现不佳,并且避免操控变弱。 filter和orderBy都需要引用对象属性参数。...Angular每秒钟多次调用这些管道方法,即使是中等大小列表,用户体验也会严重降级。 filter和orderBy经常被滥用在Angular 1应用程序中,导致投诉Angular本身很慢。

    6.4K20

    Angular 显示英雄列表

    它会为列表每项数据复写它宿主元素。 在这个例子中  就是 *ngFor 宿主元素 heroes 就是来自 HeroesComponent 类列表。...依次遍历这个列表,hero 会为每个迭代保存当前英雄对象。 不要忘了 ngFor 前面的星号(*),它是该语法中关键部分。 浏览器刷新之后,英雄列表出现了。...主从结构 当用户在主列表中点击一个英雄,该组件应该在页面底部显示所选英雄详情。 在本节,你将监听英雄条目的点击事件,并更新英雄详情。...Angular 会把所点击  上 hero 对象传给它,这个 hero 也就是前面在 *ngFor 表达式中定义那个。...为什么这样是正常  selectedHero 为 undefined ,ngIf 从 DOM 中移除了英雄详情。因此也就不用担心 selectedHero 绑定了。

    4K30

    【Appetite】ionic3实录(七)次页实现及分析解决问题【下】

    更新会影响到dom,所以应该在数据更新从而使得dom更新完成后再调用initSwiper方法。...angular脏检测机制是基于一定条件和时间,在给this.vm.dessertSlides赋值,dom还没更新完成就调用initSwiper方法不一定会获得想要结果,所以在此之前调用手动检测方法...也就是说,前者只会初始化一次,而后两者每次显示都需要重新初始化,进一步说,若使用后两者方式,对于这里用到swiper,它不是一个angular封装起来组件,不会自动初始化,我们每次显示它都需要显式调用一下...这并不是说都不要用*ngIf,因为页面元素太多时会容易导致界面卡顿,所以没用多余元素应该移除,此时就用它。一句话说就是根据情况合理选择显示控制方法。...问题三延伸:既然ion-slides已经是封装起来控件了,我们用它不是可以省掉不少代码?

    1.4K20

    AngularDart4.0 英雄之旅-教程-04明细 顶

    应用模板文件 您将对应用程序组件模板进行多次更新。...刷新浏览器,该应用程序不再失败,名称列表再次显示在浏览器中。 没有选定英雄,ngIf指令从DOM中移除英雄详情HTML。 没有英雄细节元素或绑定担心。...在结构指令页面和模板语法页面的内置指令部分阅读有关ngIf和ngFor更多信息。 格式化选中hero 当选择英雄细节显示在列表下方,很难在列表中识别选定英雄。...在模板中,将以下绑定添加到标记中: [class.selected]="hero === selectedHero" 表达式(hero === selectedHero)为trueAngular...表达式为falseAngular删除选定类。 ===运算符测试给定对象是否相同。 在模板语法指南中阅读有关[class]绑定更多信息。

    3K30

    AngularDart4.0 指南- 表单 顶

    创建一个模型 当用户输入表单数据,您将捕获其更改并更新模型实例。 直到你知道模型是什么样子,你才能布置表格。 一个模型可以像“钱包”一样简单,掌握关于应用程序重要事实事实。...你会看到一个样式化表单! 使用* ngFor添加powers 英雄必须从一个固定机构批准权力列表中选择一个超级大国。 您在内部维护该列表(在HeroFormComponent中)。...您将在表单中添加一个select,并使用ngFor(先前在“显示数据”页面中看到一种技术)将选项绑定到powers列表。...valid反映了控制值有效。 样式控件 有效控制属性是最有趣,因为一个控制值无效,你想发送一个强烈视觉信号。...控件是“原始隐藏消息实现了这个目标。 您向表单添加一个“清除”按钮,您会看到此选项重要。 英雄Alter Ego是可选,所以你可以不用关那个。 英雄power选择是必需

    17.5K30

    AngularDart4.0 英雄之旅-教程-08HTTP 顶

    提供HTTP服务 您将使用Dart http软件包客户端类与服务器进行通信。 Pubspec更新 通过添加Dart http和stream_transform软件包来更新软件包相关: ?...URL中英雄id标识服务器应该更新哪个英雄。 另外,响应中数据是单个英雄对象而不是列表。...当应用程序使用模拟英雄列表更新直接应用于单个应用程序范围共享列表英雄对象。 现在,您正在从服务器获取数据,如果您希望更改持续存在,则必须将其写回服务器。...if (name.isEmpty) return; heroes.add(await _heroService.create(name)); selectedHero = null; } 给定名字不是空白...* ngFor只能通过异步管道(AsyncPipe)进行路由才能对Stream执行所有操作。 异步管道subscribes 流并产生* ngFor英雄列表

    11K30

    angular知识点梳理第二篇-基本语法

    文章目录 前文回顾 基本语法 常见指令 NgModel NgFor NgIf Ng-container 管道 前文回顾 前面已经写了关于angular项目的基本介绍和如何创建一个angular项目,这一篇主要梳理一些...-- 使用{{}}进行数据获取 --> {{inputData}} 运行效果 NgFor NgFor和我们js中for循环渲染数据是一致,所以这里是比较容易理解,简单演示一下...:hidden是要区别开if判断为false时候,页面上是整个元素都消失了,而不是仅仅隐藏了css样式 在需要使用数据绑定组件进行数据处理 import { Component, OnInit...是基本一致不是完全一致,我们可以将它看作一个承载体,也就是说我们无法进行包裹判断一些元素或者段落可以使用这个进行包裹,因为他是一个不被渲染tag,所以使用时候是没有什么问题,举个例子!...官方的话:为没有 DOM 元素指令安排宿主 管道 管道其实就是具有一定功能函数,主要是一些场景是对字符串什么进行简单转化,当然我们也可以自己使用自定义函数进行数据转换,只是angular给我们提供了一些初始化功能函数管道详细列表

    2.5K30

    Angular 从入坑到挖坑 - 表单控件概览

    而响应式表单在表单数据发生变更,FormControl 实例会返回一个新数据模型,而不是直接修改原来数据模型 4.2、模板驱动表单 通过使用表单专属指令(例如 ngModel 进行双向数据绑定)...4.2.3、数据有效验证 某些时候需要对于用户输入信息做有效验证,此时可以在控件上添加上原生 HTML 表单验证器来设定验证条件,表单控件数据发生变化时,angular 会通过指令方式对数据进行验证...,从而生成错误信息列表 在进行用户输入数据有效验证,在控件上通过添加一个模板引用变量来暴露出 ngModel,从而在模板中获取到指定控件状态信息,之后就可以通过获取错误信息列表来进行反馈 <div...在数据验证失败情况下,对于系统来说,表单是不允许提交,因此可以将提交事件绑定到表单 ngSubmit 事件属性上,通过模板引用变量形式,在提交按钮处进行数据有效判断,无效,禁用表单提交按钮...对于使用了 FormGroup 表单来说,使用 setValue 进行数据更新,必须保证新数据结构与原来结构相同,否则就会报错 import { Component, OnInit } from

    18.9K20

    Angular学习资料大全和常用语法汇总(让后端程序员轻松上手)

    ,首先一点不要忽视了官网重要,而且Angular官网还有中文版相对而言更容易上手。...ngFor循环使用: 属性index、count、first、last、even、odd index属性提供当前对象索引 count提供当前数据集长度,类似于datasource.length...first返回当前列表项是否为第一个 last返回当前列表项是否为最后一个 even返回当前列表项index是否为偶数,通常用在增加样式用来区分行与行之间 odd返回当前列表项index是否为奇数 <ul...将文本转换为列表 (数组) ng-model 绑定 HTML 控制器值到应用数据 ng-model-options 规定如何更新模型 ng-mousedown 规定按下鼠标按键行为 ng-mouseenter...规定鼠标指针穿过元素行为 ng-mouseleave 规定鼠标指针离开元素行为 ng-mousemove 规定鼠标指针在指定元素中移动行为 ng-mouseover 规定鼠标指针位于元素上方行为

    5.3K41

    小白如何用Angular开发一个简单Web应用

    Step 1 需求逻辑梳理根据平时使用todo list工具逻辑,里面其实就主要是三个关键节点需要进行设置:一是新建任务项,可以及时添加需要关注一些工作内容;二是对任务项更新,例如我已经完成了一项任务工作那就需要对这项工作进行状态更新...这里面主要存在3步,一是利用 Angular CLI 创建一个新项目,二是我们需要定义应用组建和模块,第三步则是比较关键功能项添加,我会在里面也增加添加项、更新项和删除项。...export class AppComponent { todos: Todo[] = []; }在 app.component.html 里添加列表显示逻辑: <li *ngFor...== todo);}最后我们启动开发服务器就完成了整个开发工作,整个开发流程是最基础组件、数据绑定和事件处理,这样就实现了一个简单To-Do列表应用。...再说下 Angular 与 React 和 Vue JS 使用起来整体感受,在从零开始学习难度上 Angular 学起来挑战会稍微高一些,实质原因还是因为里面存在更多内置关系。

    37651
    领券