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

angular *ngIf未按预期工作html标记在值更改后不会重新显示

Angular中的*ngIf指令用于根据条件动态显示或隐藏HTML元素。当条件为true时,元素会被渲染并显示在页面上;当条件为false时,元素会被从DOM中移除。

然而,有时候在使用*ngIf时可能会遇到一些问题,导致它未按预期工作。其中一个常见的问题是,当值更改后,HTML标记不会重新显示。

这个问题通常是由于Angular的变更检测机制引起的。Angular使用了一种称为脏检查的机制来检测数据的变化,并根据变化来更新视图。但是,当我们使用*ngIf时,Angular可能无法正确检测到值的变化,从而导致HTML标记不会重新显示。

解决这个问题的一种方法是使用Angular的ChangeDetectorRef服务手动触发变更检测。ChangeDetectorRef允许我们手动通知Angular进行变更检测,以确保视图与数据的状态保持同步。

首先,我们需要在组件的构造函数中注入ChangeDetectorRef服务:

代码语言:txt
复制
import { Component, ChangeDetectorRef } from '@angular/core';

@Component({
  selector: 'app-example',
  template: `
    <div *ngIf="condition">{{ value }}</div>
    <button (click)="changeValue()">Change Value</button>
  `,
})
export class ExampleComponent {
  condition: boolean = true;
  value: string = 'Hello';

  constructor(private cdr: ChangeDetectorRef) {}

  changeValue() {
    this.value = 'World';
    this.cdr.detectChanges(); // 手动触发变更检测
  }
}

在上面的示例中,我们在组件的构造函数中注入了ChangeDetectorRef服务,并在changeValue方法中调用了cdr.detectChanges()来手动触发变更检测。这样,当我们点击"Change Value"按钮时,值会被更新并重新显示在页面上。

除了手动触发变更检测,还有其他一些方法可以解决*ngIf未按预期工作的问题,例如使用ngZone.run方法、使用异步管道等。但是,这些方法可能会增加代码的复杂性,因此在实际开发中需要根据具体情况选择合适的解决方案。

总结起来,当*ngIf未按预期工作时,可以考虑使用ChangeDetectorRef服务手动触发变更检测来解决问题。这样可以确保HTML标记在值更改后能够重新显示。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

AngularDart4.0 指南- 显示数据 顶

用插显示组件属性 显示组件属性的最简单方法是通过插来绑定属性名称。 使用插,可以将属性名称放在视图模板中,并用双花括号括起来:{{myHero}}。...修改的模板使用双重大括号插显示两个组件属性: template: ''' {{title}} My favorite hero is: {{myHero}}</h2...当这些属性改变时,Angular会更新显示。 更准确地说,重新显示是在与视图相关的某种异步事件之后发生的,例如按键,计时器完成或对HTTP请求的响应。...用NgIf进行条件显示 有时候,只有在特定情况下,应用程序才需要显示视图或视图的一部分。 如果有三个以上的英雄,让我们更改示例以显示一条消息。...如果有三个或更少的项目,Angular会忽略该段落,所以不会显示任何消息。 有关更多信息,请参阅模板语法页面的模板表达式部分。 Angular没有显示和隐藏消息。

5.3K10

AngularDart 4.0 高级-结构指令 顶

组件以本地HTML元素的方式管理HTML区域。 从技术上讲,这是一个模板指令。 属性指令改变元素,组件或其他指令的外观或行为。 例如,内置的NgStyle指令可以同时更改多个元素样式。...从积极的方面来说,再次显示元素很快。 该组件的以前的状态被保存并准备显示。 该组件不会重新初始化 - 这种操作可能很昂贵。 所以隐藏和展示有时候是正确的。...当NgSwitchCase的与switch的匹配时,会显示它的宿主元素。当没有同级NgSwitchCase匹配switch的时,NgSwitchDefault显示它的宿主元素。...template元素 HTML 5 是用于呈现HTML的方案。 它从不直接显示。 事实上,在呈现视图之前,Angular用注释替换及其内容。...浏览器不会在中显示。 模板来解决 Angular 是一个分组元素,不会干扰样式或布局,因为Angular不会将其放入DOM中。

16K20

ng-content 中隐藏的内容

由于许多问题与Angular 中的组件生命周期相关,因此我们的主要组件将显示一个计数器,用于展示它已被实例化的次数: import { Component } from '@angular/core';...但是如果你通过按钮进行切换操作,你会注意到计数器的不会增加。这意味着我们的计数器组件只被实例化了一次 - 从未被销毁和重新创建。...为什么不按照我们的预期运行? The explanation 不会 “产生” 内容,它只是投影现有的内容。...Wrapper { show = true; @ContentChild(TemplateRef) template: TemplateRef; } 现在我们的 counter 组件,每当我们隐藏并重新显示时都正确递增...每个盒子中有一个计数器,显示 1,2 和 3,这正是我们之前预期的结果。

2.7K30

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

模板语句的附作用不只是好的,但可预期。 删除英雄更新模型,可能会触发其他更改,包括查询并保存到远程服务器。 这些变化通过系统渗透,并最终显示在相关视图。...修改的size流向样式绑定,使显示的文本变大或变小。 双向绑定语法实际上只是属性(property)绑定和事件绑定的语法糖。...例如,重新查询服务器可能会重置所有新的英雄对象的列表。 大多数,如果不是全部,以前显示的英雄。 你知道这一点,因为每个英雄的ID没有改变。 但是Angular只能看到新的对象引用列表。...例如,您可以将数字显示为货币,强制文本为大写,或筛选列表并对其进行排序。 对于这些小型转换来说,Angular 管道是一个很好的选择。 管道是简单的函数,它接受一个输入并返回一个转换。...The title is {{title}} 视图仍然呈现,但显示是空白的; 你只看到“The title is”没有任何东西。 这是合理的行为。 至少该应用程序不会崩溃。

29.9K20

AngularDart 4.0 高级-生命周期钩子 顶

生命周期序列 通过调用其构造函数创建组件/指令Angular在特定时刻按以下顺序调用生命周期钩子方法: 钩子 作用和时机 ngOnChanges Angular重新)设置数据绑定输入属性时响应。...DoCheck 使用自定义更改检测实现ngDoCheck方法。 看看Angular多久会调用这个钩子,并在更改日志观察它。 AfterView 通过视图显示Angular的意图。...peek-a-boo存在以显示Angular如何按预期顺序调用钩子。 此快照反映用户单击“创建...”按钮然后单击“销毁...”按钮后日志的状态。 ?...这是指令的完美渗透工作。 英雄们永远不会知道他们正在被监视。 一边开玩笑,注意两点: Angular为指令和组件调用钩子方法。 间谍指令可以提供对不能直接更改的DOM对象的洞察。...日志条目显示为power属性更改的字符串。 但ngOnChanges并没有捕捉到hero.name的变化,这一开始令人惊讶。 当输入属性的改变时,Angular只会调用钩子。

6.1K10

浅谈Angular

1.准备工作: ①全局安装 Angular CLI。...创建项目: 要想使用 npm 来安装 CLI,请打开终端/控制台窗口,并输入下列命令: npm install -g @angular/cli ②创建工作区和初始应用:ng new 文件名 ③启动开发服务器...ng-show本质上设置元素的display为none,只是设置样式,DOM结构还在,而*ngIf是真正意义上的从DOM结构中移除结构型指令 *ngIf--控制元素的显隐性 ?...-- 处理货币 currency 参数一:货币符号 美元 'USD',欧元 'EUR' 参数二:布尔,是否显示货币的符号,默认true 参数三:整数最少位数.小数最少位数-小数最多位数-->... 参数订阅(RxJS) 遇到的问题:数据不会及时更新,原因:组件的ngOnInit方法只会在其被创建时走一次,如果该组件不销毁,init方法不会再走,导致当前数据无法更新 解决办法

4.4K10

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

在此页面中,您将扩展“Tour of Heroes”应用程序,以显示英雄列表,并允许用户选择英雄并显示英雄的详细信息。 完成此页面,该应用应该看起来像这个实例(查看源代码)。...当您进行更改时,请通过重新加载浏览器窗口来保持运行。 应用程序重构 在添加新功能之前,您可以从应用程序重构中受益。 应用模板文件 您将对应用程序组件的模板进行多次更新。...lib/app_component.html (ngIf) <div *ngIf="selectedHero !...刷新浏览器,该应用程序不再失败,名称列表再次显示在浏览器中。 当没有选定的英雄时,ngIf指令从DOM中移除英雄详情HTML。 没有英雄细节元素或绑定担心。...在下一页中,您将将应用程序拆分为子组件,并使它们一起工作

3K30

Angular 从入坑到挖坑 - 组件食用指南

="expr">NgIf 结构型指令 当 expr 属性为 true 时,这个元素则会显示在页面上,当属性为 false 时,则不显示该元素 ngIf 指令并不是通过使用 css 样式来隐藏元素的...,再次显示时不用重新进行初始化过程 NgFor:通过定义单条数据的显示格式,angular 以此为模板,循环渲染出所有的数据 <p *ngFor="let item of products; let...<em>后</em>,视图依然会渲染,只是<em>显示</em>的<em>值</em>为空白 5.2、安全导航运算符 第五个专案的名称为:{{products[5].name}} ?...纯变更是指对原始类型<em>值</em>(String、Number、Boolean、Symbol)的<em>更改</em>, 或者对对象引用(Date、Array、Function、Object)的<em>更改</em> 非纯管道 每个组件的变更周期都会执行...trackBy 也<em>不会</em><em>重新</em>渲染整个 DOM,只会<em>重新</em>渲染改变的数据↩

15.8K30

AngularDart4.0 指南-体系结构概述 顶

用户的更改也会返回到组件,将属性重置为最新,就像事件绑定一样。 Angular在每个JavaScript事件循环中处理所有数据绑定,从应用程序组件树的根到所有子组件。 ?...出于这个原因,这个应用程序的JavaScript和TypeScript版本可以使用selectedHero作为* ngIf表达式的。 Dart版本必须使用布尔运算符!=替换。...ngModel通过设置其显示属性并响应更改事件来修改现有元素(通常是)的行为。...Angular不强制执行这些原则。 如果您用3000行代码编写“kitchen sink”组件,它不会抱怨。...Pipes:通过转换显示来改善用户体验。 Router:在客户端应用程序中从一个页面到另一个页面进行导航,而不会离开浏览器 Testing:为您的应用编写组件测试和端到端测试。

7.9K30

理论 | Angular 中的响应式编程 -- 浅淡 Rx 的流式思维

就这个需求来看的话,年龄和年龄单位这两个数据要一起来考虑, 上图中(由于太懒,后面的合并虚线就没有画了),上面两个流为原始数据流,一个是年龄的数据流,每次更改年龄数时,这个数据流就产生一个数据:比如一开始初始为...Angular 中处理响应式表单只有 3 个步骤: 1、在组件的 HTML 模版中给要处理的控件加上 formControlName="blablabla" 2、form 标签中添加 [formGroup...最后,我们采用 startWith 给这个流一个初始,这是由于如果一开始我们什么都不做,两个流就都没有数据;或者只改变其中一个,另一个由于一直没有变就不会产生数据,这样的话,合并流也不会有数据。...Angular 4 中的 NgIf 的改进 Angular 4 中的 ngIf 现在可以携带 else 了,如果你曾经使用过 Angular 就知道,原来我们是得写两个 ngIf 来完成类似的功能的。...比如下面例子中:如果用户登录成功显示用户名,否则显示登录链接。 另一个改进是 ngIf 中现在可以将评估表达式的结果赋值给一个变量,好处是什么呢?

5.2K10

Angular核心概念:数据绑定

(达内教育学习笔记)仅供学习交流 Angular数据绑定 Angular核心概念:数据绑定(1)HTML绑定:{{NG表达式}}(2)属性绑定(3)指令绑定(4)事件绑定()(5)双向数据绑定指令...:[(ngModel)]---重点 Angular核心概念:数据绑定 (1)HTML绑定:{{NG表达式}} (2)属性绑定 (3)指令绑定 (4)事件绑定() (5)双向数据绑定指令:[(ngModel... … 举例: html文件 <div *ngIf="isPayingUser...DOM树结构,必须使用开头,如ngFor,*ngIf 3.属性型指令:不会影响DOM树结构,只是影响元素外观或行为,必须用[]括起来,如 :[ngClass],[ngStyle] > 当前的用户绑定{{uname}} ts文件 改变打印在控制台上 uname="dingding";

3.5K10

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

swiper-container'其实是个选择器,所以它也是依托dom操作的,此外,由于我们使用了数据绑定,this.vm.dessertSlides的值更新会影响到dom,所以应该在数据更新从而使得dom更新完成再调用...也就是说,前者只会初始化一次,而后两者每次显示都需要重新初始化,进一步说,若使用后两者方式,对于这里用到的swiper,它不是一个angular封装起来的组件,不会自动初始化,我们每次显示它时都需要显式调用一下...这并不是说都不要用*ngIf,因为当页面元素太多时会容易导致界面卡顿,所以没用的多余元素应该移除,此时就用它。一句话说就是根据情况合理选择显示控制方法。...是因为该组件在异步获取到数据this.vm.dessertSlides前已完成了初始化了,这样新数据其实没有应用到,为了处理这种情况,我们改造一下html,为ion-slides组件加上一段*ngIf=...vm.dessertSlides"> 这样当新数据有且长度大于

1.4K20

Angular快速学习笔记(3) -- 组件与模板

显示数据 在 Angular 中最典型的数据显示方式,就是把 HTML 模板中的控件绑定到 Angular 组件的属性。...它是语法中不可或缺的一部分 通过 NgIf 进行条件显示 有时,应用需要只在特定情况下显示视图或视图的一部分,这个时候使用ngif,同vue.js里的v-if 小结 带有双花括号的插表达式 (interpolation) 来显示一个组件属性 用 ngFor 显示数组 用一个 TypeScript 类来为你的组件描述模型数据并显示模型的属性 用 ngIf...### 插表达式 ( {{...}}) 插表达式{{...}}可以把计算的字符串插入到 HTML 元素标签内的文本或对标签的属性进行赋值。...钩子 用途及时机 ngOnChanges() 当 Angular重新)设置数据绑定输入属性时响应。

15.2K30

Angular教程】-组件初识|8月更文挑战

组件相关的其他文件暂时先放一放,在Vue开发的时候我们创建好的组件总是要挂载才能使用的,那angular需要挂载吗?...应为angular项目创建的时候默认初始化了git仓库,我们这会儿可以看到还有一个文件是有变化的,那就是app.module.ts,打开文件我看就看到了新创建的组件已经自动的挂载到了全局的app上。...现在我们通过修改**app.component.html**内容来显示一下我们自己的组件吧 清空app.component.html的内容 还记得我们创建的组件叫什么吗?..."不显示" : "显示" }} Hello World NgFor(内置): 给组件ts添加属性: public list: Array...还有多少同学在用angular呀,要不是工作需要也不会再接触了,第一次学angualr还是在15年。还有一点哈,原来都是pia pia贴代码,今天头一回自述的多,就当锻炼了,表述不周还请指正哈。

1.9K20

ionic3应该善用组件和指令

往往很多人会封装组件,但不会去封装指令,而选择用Provider或者Pipe(管道,相当于angular1时的过滤器filter),甚至样式来实现,虽说这也能解决部分问题,但不是最优的,Directive...其实就是模版指令,如ngIf,当条件为true时,该元素会被添加到DOM中。其主要依赖TemplateRef和ViewContainerRef来完成操作。...string){ this.el.nativeElement.style.backgroundColor = color; } } 改动的只是用@Input装饰器修饰,然后用set方法触发获得的操作...自定义结构指令 实例:山寨一个*ngIf的的收缩显示指令,仅为了起到抛砖引玉效果。..." > {{btnWorkText}} 同样在module里引入,在html如下调用即可: <content-empty [btnWorkText]=""

3.5K40
领券