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

Angular sidenav.toggle()在*ngIf重新出现按钮后不起作用

Angular中的sidenav.toggle()函数用于切换导航栏的显示和隐藏状态。但是在使用*ngIf指令重新显示按钮后,sidenav.toggle()可能不起作用的问题通常是由于Angular的变更检测机制引起的。

在Angular中,*ngIf指令会改变DOM结构,当条件为真时,创建指定的DOM元素,并从DOM中移除它们,当条件为假时,移除DOM元素。这样会导致DOM元素的重新创建和销毁,从而导致原始的DOM元素上的事件监听器被删除。

为了解决这个问题,可以尝试使用*ngIf指令的另一个变体,即[hidden]属性绑定。[hidden]属性只是简单地改变元素的可见性,而不改变DOM结构。因此,当条件为假时,元素仍然存在于DOM中,并保留了事件监听器。

示例代码如下:

代码语言:txt
复制
<button (click)="toggleSidenav()" [hidden]="!showSidenav">Toggle Sidenav</button>
<mat-sidenav #sidenav mode="side" opened>
  Sidenav Content
</mat-sidenav>
代码语言:txt
复制
export class AppComponent {
  showSidenav = true;
  
  toggleSidenav() {
    this.showSidenav = !this.showSidenav;
  }
}

在上述示例中,toggleSidenav()函数会在按钮点击时切换showSidenav变量的值,从而切换导航栏的可见性。[hidden]属性将根据showSidenav的值来控制按钮的显示和隐藏。

此外,还可以通过使用ChangeDetectorRef手动触发变更检测,强制更新DOM元素的状态。示例代码如下:

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

export class AppComponent {
  showSidenav = true;
  
  constructor(private cdr: ChangeDetectorRef) {}
  
  toggleSidenav() {
    this.showSidenav = !this.showSidenav;
    this.cdr.detectChanges();
  }
}

通过调用ChangeDetectorRef的detectChanges()方法,可以手动触发变更检测,确保DOM元素的状态得到更新。

至于推荐的腾讯云相关产品和产品介绍链接地址,由于不能提及特定的品牌商,建议在腾讯云的官方网站上查找与云计算相关的产品和服务。腾讯云提供了丰富的云计算解决方案,包括云服务器、云数据库、云存储、云原生应用等,可以根据具体需求选择相应的产品。

希望以上内容能够帮助到您,如果还有任何问题,请随时提问。

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

相关·内容

ng-content 中隐藏的内容

如果你尝试 Angular 中编写可重复使用的组件,则可能会接触到内容投射的概念。然后你发现了 ,并找到了一些关于它的文章,进而实现了所需的功能。...会出现什么情况? 页面中会显示一个或两个框,如果我们包含两个框,它们的内容是显示 1 和 1 或 1 和 2?...我们尝试解释为什么之前,让我们再来验证一个问题,即在 ng-content 指令的外层容器中添加 ngIf 指令: import { Component } from '@angular/core';...但是如果你通过按钮进行切换操作,你会注意到计数器的值不会增加。这意味着我们的计数器组件只被实例化了一次 - 从未被销毁和重新创建。...难道这是 ngIf 指令产生的问题,让我们测试一下 ngFor 指令,看看是否有同样的问题: import { Component } from '@angular/core'; @Component

2.7K30

Angular2 之 结构型指令几个概念

我们经常看到的内置的结构型指令有:ngIf、ngSwitch、ngFor。 下面我们着重介绍ngIfNgIf案例分析 该指令接受一个布尔值,并据此让一整块DOM树出现或者消失。... 注意:这里是出现或者消失,并不是隐藏。 隐藏元素的利弊 当我们隐藏元素时,组件的行为还在继续。 它仍然附加子啊它所属于的DOM元素上,它仍然监听事件。...angular会继续检查哪些能影响数据绑定的变更。组件原本要做的哪些事情仍然进行!它还是占用着那么多的资源。 另外一方面,重新显示这个组件会很快。...当ngIf重新变成true的时候,angular重新创建该组件及其子树。angular重新运行每个组件的初始化逻辑。...,Angular的控制下,DOM的效果是不同的。 ?

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

    以下示例中,目标是按钮的单击事件。...单击按钮通过双向绑定更新AppComponent.fontSizePx。 修改的size值流向样式绑定,使显示的文本变大或变小。...这里我们看到NgIf守护两个。 currentHero名称仅在有currentHero时出现。 nullHero从不显示。 <div *ngIf="currentHero !...对于这些小型转换来说,Angular 管道是一个很好的选择。 管道是简单的函数,它接受一个输入值并返回一个转换的值。...想象一下,诸如a.b.c.d这样的长属性路径中的某个地方防止空值。 Angular安全导航操作符(?.)是一种更为流畅和方便的方法来防止属性路径中出现空。表达式达到第一个空值时会被释放。

    30K20

    AngularDart4.0 指南- 显示数据 顶

    当你完成,它应该是这样的:lib/app_component.dart import 'package:angular/angular.dart'; @Component( selector: '...当这些属性改变时,Angular会更新显示。 更准确地说,重新显示是与视图相关的某种异步事件之后发生的,例如按键,计时器完成或对HTTP请求的响应。...现在英雄出现在一个无序的列表中。 ? 为数据创建一个类 应用程序的代码直接在组件内定义数据,这不是最佳实践。 但是,一个简单的演示中,没关系。 目前,绑定是一个字符串列表。...Angular ngIf指令根据布尔条件插入或删除一个元素。... 不要忘记* ngIf中的星号(*)。 这是语法的重要组成部分。 “模板语法”页面的ngIf部分阅读有关ngIf和*的更多信息。

    5.3K10

    AngularDart4.0 英雄之旅-教程-07路由 顶

    完成,用户将可以像这样浏览应用程序: ? 为了满足这些要求,您将添加Angular路由器到应用程序。 有关路由器的更多信息,请阅读路由和导航页面。  ...开始阶段 继续英雄之旅之前,请确认您具有以下结构。 ? 如果该应用程序尚未运行,请启动该应用程序。 进行更改时,请通过重新加载浏览器窗口来保持运行。...添加路由 应该在用户点击按钮显示英雄而不是自动显示。 换句话说,用户应该能够导航到英雄列表。 更新pubspec 使用Angular路由(angular_router)启用导航。...浏览器中,转至应用程序根目录(/)并重新加载。 该应用程序显示dashboard ,您可以dashboard 和heroes之间导航。 ...查看详细信息按钮不起作用。 更新HeroesComponent类 响应按钮单击,HeroesComponent导航到HeroesDetailComponent。

    17.6K30

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

    使用 ngModel 进行模板绑定时,angular form 标签上自动附加了一个 NgForm 指令,因为 NgForm 指令会控制表单中带有 ngModel 指令和 name 属性的元素,而...name 属性则是 angular 用来注册控件的 key,所以表单中使用 ngModel 进行双向数据绑定时,必须要添加 name 属性 4.2.2、跟踪表单控件的状态 表单中使用 ngModel...在数据验证失败的情况下,对于系统来说,表单是不允许提交的,因此可以将提交事件绑定到表单的 ngSubmit 事件属性上,通过模板引用变量的形式,提交按钮处进行数据有效性判断,当无效时,禁用表单的提交按钮...public name = new FormControl(''); constructor() { } ngOnInit(): void { } } 当在组件中创建好控件实例,...{ 'nameInvalid': true } : null; } } 当实现了继承的 validate 方法,就可以模板的控件上添加该指令

    18.9K20

    使用angular4和asp.net core 2 web api做个练习项目(三)

    VS解决方案中设置多个项目同时启动: AspNetIdentityAuthorizationServer就是authorization server....loginStatusChanged是一个EventEmitter, 任何订阅了这个事件的component, 都会在登录用户变化时(登录/退出)触发component里面自定义的事件. logout()是退出, 调用方法也会跳转到...最后别忘了app.module里面注册: providers: [ ClientService, AuthService ], 登陆成功跳转回掉页面  建立一个跳转回掉的component.../a> 主要是检查是否有用户登陆了, 有的话不显示注册和登陆链接, 并且显示退出链接按钮...以便切换导航栏的按钮显示情况. angular的部分先到这, 然后要 修改一个identity server的配置: VS2017打开AspNetIdentityAuthorizationServer

    1.3K80

    AngularDart 4.0 高级-结构指令 顶

    三种常见的内置结构指令 - NgIf,NgFor和NgSwitch ... - 模板语法指南中进行了描述,并在整个Angular文档中的示例中进行了介绍。...NgIf案例研究 NgIf是最简单的结构指令,也是最容易理解的。 它需要一个布尔表达式并使DOM的整个块出现或消失。...该组件不会重新初始化 - 这种操作可能很昂贵。 所以隐藏和展示有时候是正确的。...满足Angular模板中的类似需求。 编写一个结构指令 本节中,您将编写一个与NgIf相反的UnlessDirective结构指令。 NgIf条件为true时显示模板内容。... 当条件为假时,出现顶部(A)段落并且底部(B)段落消失。 条件为真时,顶部(A)段被删除,底部(B)段出现。 ? 概要 您可以尝试实例中查看本指南的源代码(查看源代码)。

    16.1K20

    Angular 显示英雄列表

    完成应该如下显示: heroes.component.html heroes.component.html (heroes template)content_copyMy Heroes 上的 hero 对象传给它,这个 hero 也就是前面 *ngFor 表达式中定义的那个。...英雄们显示列表中,并且所点英雄的详情也显示了页面的下方。 修复 - 使用 *ngIf 来隐藏空白的细节 该组件应该只有当 selectedHero 存在时才显示所选英雄的详情。...并且为这个 div 添加 Angular 的 *ngIf 指令,把它的值设置为 selectedHero。 不要忘了 ngIf 前面的星号(*),它是该语法中的关键部分。...点击一个英雄,它的详情就出现了。 这个应用看起来又再次工作正常显示了。 英雄显示列表中,当你单击英雄的名字的时候,有关你单击英雄的详细信息就显示页面的底部了。

    4.4K70

    Angular核心概念:数据绑定

    NG表达式禁止出现new关键字。NG表达式中JSON是undefined。...对象属性就是CSS class名,属性值为ture/false,turn的话该class就出现;否则该class不出现 (4)事件绑定() (click)=“zengjia”; 注意:事件名用()括起来...,处理函数名必须有() (5)双向数据绑定指令:[(ngModel)]—重点 方向1:Model=》View,模型变则视图变,用[]绑定 方向2:View=》Model,视图(表单元素)变则模型变,...模块中,使用之前必须添加 app.module.ts主模块中导入模块 import {FormsModule} from'@angular/forms'; import:[FormsModule]...--Angular专用事件:“模型数据改变”ngModelChange-->> 当前的用户绑定{{uname}} ts文件 改变值打印控制台上 uname="dingding";

    3.5K10

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

    生命周期序列 通过调用其构造函数创建组件/指令Angular特定时刻按以下顺序调用生命周期钩子方法: 钩子 作用和时机 ngOnChanges Angular重新)设置数据绑定输入属性时响应。...ngOnInit之前调用并且每当有一个或多个数据绑定输入属性发生变化时调用。 ngOnInit Angular首次显示数据绑定属性并设置指令/组件的输入属性,初始化指令/组件。...peek-a-boo存在以显示Angular如何按预期顺序调用钩子。 此快照反映用户单击“创建...”按钮然后单击“销毁...”按钮后日志的状态。 ?...OnInit 使用ngOnInit有两个主要原因: 施工不久执行复杂的初始化 Angular设置输入属性后设置组件 有经验的开发人员同意组件应该便于构建且安全。...ngOnInit之前Angular会调用ngOnChanges ...并在此之后多次调用。 它只调用一次ngOnInit。 您可以期待Angular创建组件立即调用ngOnInit方法。

    6.2K10

    过渡到 Angular 17 的新控制流语法

    最近将我们当前项目的一些模板迁移到Angular 17的新控制流语法,我觉得分享一些见解能够帮助一些人顺利过渡到这种新语法,为每个控制流结构提供清晰和明确的示例。所以,让我们开始吧。...传统指令与Angular 17的控制流语法对比让我们使用一些示例来比较传统指令和Angular 17的控制流语法:*ngIf指令 vs @if控制块Before(传统 *ngIf):<div *ngIf...例如,某些情况下,您可以使用 @defer 块来延迟加载内容。向后兼容性和性能Angular 17允许您在应用程序中同时使用新旧语法。...结论Angular 17引入的新控制流语法处理Angular应用程序中的模板和渲染逻辑方面带来了显著的改进。转换到这种新语法,承诺会使我们的代码更易读、易维护和高性能。...正如我们自己的项目中所经历的,这些变化不仅是外观上的改变,而且是功能上的改变,提升了我们使用Angular的方式。我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

    67320

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

    文章目录 前文回顾 基本语法 常见指令 NgModel NgFor NgIf Ng-container 管道 前文回顾 前面已经写了关于angular项目的基本介绍和如何创建一个angular项目,这一篇主要梳理一些...,但是angular中我们引入框架的一个核心模块FormsModule才可以,该指令就是将数据驱动视图的改变!...app.modules.ts中引入forms模块 // 核心模块 import { NgModule } from '@angular/core'; //引入forms模块实现数据的双向绑定 import...-- 默认的是没有key的,这里需要key的地方需要给index重新赋值, --> {{item.title}}...,页面上是整个元素都消失了,而不是仅仅隐藏了css样式 需要使用数据绑定的组件进行数据的处理 import { Component, OnInit } from '@angular/core'; @

    2.5K30

    Angular 显示英雄列表

    完成应该如下显示: heroes.component.html heroes.component.html (heroes template) content_copy My Heroes 上的 hero 对象传给它,这个 hero 也就是前面 *ngFor 表达式中定义的那个。...英雄们显示列表中,并且所点英雄的详情也显示了页面的下方。 修复 - 使用 *ngIf 来隐藏空白的细节 该组件应该只有当 selectedHero 存在时才显示所选英雄的详情。...并且为这个 div 添加 Angular 的 *ngIf 指令,把它的值设置为 selectedHero。 不要忘了 ngIf 前面的星号(*),它是该语法中的关键部分。...点击一个英雄,它的详情就出现了。 这个应用看起来又再次工作正常显示了。 英雄显示列表中,当你单击英雄的名字的时候,有关你单击英雄的详细信息就显示页面的底部了。

    4K30

    Angular 内容投影

    答案是可以的, Angular 中引入了内容投影的概念,即通过使用 指令来实现内容投影的功能。 ?...select 属性 如果你已经理解了上面的内容,那我们继续,假设对于注册表单,”提交“ 按钮的名称我们想改为 ”注册“,而登录表单的 ”提交“ 按钮,我们想改为 ”登录“。...虽然我们实现了内容投影,即把标题和按钮都成功投影到 AuthFormComponent 组件中,但你会发现按钮的位置并不是预期的。那么如何解决这个问题呢?...下面我们来介绍组件内部,如何获取 投射的内容。 Angular 中提供了 ContentChild 装饰器来获取投影的元素。...` }) export class AppComponent { // ... } 接着我们需要在 AuthFormComponent 组件中引入 ContentChildren 装饰器,更新

    2.6K20
    领券