Angular 2 使用 *ngIf 和布尔值隐藏和显示元素

2023-11-29

我想通过使用位于另一个组件中的按钮来显示和隐藏元素。

所以我有一个仪表板,里面有很多室和一个标题。

带有 app-header 和 app-chamber 的 DashboardComponent 的 HTML:

 <app-header></app-header>
    <div class="container">
      <div class="row">
        <app-chamber [kamers]="kamers"></app-chamber>
      </div>
    </div>

我的 Chamber 组件中有带有 *ngIf 的 HTML:

<div class="col-sm-6 col-md-4 col-lg-3 cardcol" *ngFor="let kamer of kamers; let i = index">
      <md-card class="chamber wit" *ngIf="kamer.patient == null">
         <p *ngIf="showId">{{kamer.id}}</p>
      </md-card>
</div>

在 HeaderComponent 中,我有一个需要显示和隐藏元素的按钮:

@Component({
  selector: 'app-header',
  templateUrl: './header.component.html',
  styleUrls: ['./header.component.css']
})
export class HeaderComponent implements OnInit {

  @Input() aList;

  dashboardComponent:DashboardComponent;

  chamberComponent:ChamberComponent;

  constructor(dashboardComponent: DashboardComponent, chamberComponent:ChamberComponent) {
    this.dashboardComponent = dashboardComponent;
    this.chamberComponent = chamberComponent;

  }

  ngOnInit() {

  }

// THIS GETS CALLED BY A BUTTON CLICK
  toggleId(){
    this.chamberComponent.toggleId();
  }

}

然后我的 ChamberComponent 代码:

@Component({
  selector: 'app-chamber',
  templateUrl: './chamber.component.html',
  styleUrls: ['./chamber.component.css']
})
      export class ChamberComponent implements OnInit {

      @Input() kamers;
      showId:boolean;

      constructor() {
        this.showId=false;
      }

      ngOnInit() {

      }

      toggleId = () => {
          this.showId = !this.showId;
      }

    }

因此,当我单击按钮时,值会发生变化(我已将其记录在控制台中),但视图未更新。

当我在 ChamberComponent 中放置一个调用toggleId() 函数的按钮时,视图会收到更新并且该元素会显示或隐藏。

但我需要通过标题上的按钮切换它。


Plunker

之间有一个小的不匹配@Input() kamers和模板*ngIf="kamer.patient == null".

  • 只需将输入更改为kamer.

模板 HTML

<md-card class="chamber wit" *ngIf="kamer.patient === null">
   <p *ngIf="showId">{{kamer.id}}</p>
</md-card>

<button (click)="toggleId()">Toggle</button>

成分

@Component({
  selector: 'material-app',
  templateUrl: 'app.component.html'
})
export class AppComponent {

  kamer = {
    patient: null,
    id: '1'
  };
  showId = false;

  ngOnInit() {

  }

  toggleId() {
    this.showId = !this.showId;
  }

}

更新(1) -笨蛋 (1)

Use @ViewChild

要引用子组件的函数,请使用查看子对象

  • Place @ViewChild('child') child;在父组件中
  • 在父模板中引用子函数,如下所示:<button (click)="child.toggleId()">Toggle</button>

父组件

@Component({
  selector: 'material-app',
  template: `
    <material-child #child></material-child>
    <button (click)="child.toggleId()">Toggle</button>
  `
})
export class AppComponent {

  @ViewChild('child') child;

}

子模板

<md-card class="chamber wit" *ngIf="kamer.patient === null">
   <p *ngIf="showId">{{kamer.id}}</p>
</md-card>

子组件

@Component({
  selector: 'material-child',
  templateUrl: 'app.component.html'
})
export class ChildComponent {

  kamer = {
    patient: null,
    id: '1'
  };
  showId = false;

  ngOnInit() {

  }

  toggleId() {
    this.showId = !this.showId;
  }

}

更新(2)-笨蛋 (2)

Use @Output() + EventEmitter

要扩展之前的设置以使用同级组件,您可以

  • 让同级使用事件发射器
  • 监听父组件中发出的事件,并调用所需的子函数ViewChild

兄弟组件

@Component({
  selector: 'material-sibling',
  template: `
    <button (click)="toggle.emit()">Toggle</button>
  `
})
export class SiblingComponent {
  @Output() toggle = new EventEmitter();
}

父组件

@Component({
  selector: 'material-app',
  template: `
    <material-child #child></material-child>
    <material-sibling (toggle)="child.toggleId()"></material-sibling>
  `
})
export class AppComponent {

  @ViewChild('child') child;

}

子模板

<md-card class="chamber wit" *ngIf="kamer.patient === null">
   <p *ngIf="showId">{{kamer.id}}</p>
</md-card>

子组件

@Component({
  selector: 'material-child',
  templateUrl: 'app.component.html'
})
export class ChildComponent {

  kamer = {
    patient: null,
    id: '1'
  };
  showId = false;

  ngOnInit() {

  }

  toggleId() {
    this.showId = !this.showId;
  }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Angular 2 使用 *ngIf 和布尔值隐藏和显示元素 的相关文章

随机推荐

  • ManyToMany 字段的 Django 自定义小部件

    有谁知道有一个显示 2 个选择框的小部件 一个显示模型中所有对象的列表 另一个显示已选择的对象 然后 用户可以从第一个列表中选择一个对象 单击 gt gt 按钮将其移动到 选定 列表 然后 当保存表单时 所选列表中的对象将保存在多对多字段中
  • 使用 JQ 替换 JSON 模板中的变量

    我想用值 Hello Jack 填充 json 模板 但 Hello 部分应保留在模板内 有什么方法可以做到这一点 我尝试了下面的代码 但它给了我错误 jq n arg person Jack my key Hello person jq
  • C# 判断文件是否被修改的方法

    我想在对文件进行一些修改后提示用户保存文件 但问题是我一生都无法这样做 有些人建议使用FileInfo类 但它只给你lastWriteTime LastAccessTime and CreationTime 我想用FileInfo类而不是F
  • Android 中 getResources() 的实现

    我刚刚开始学习android编程 我对getResources 方法产生了疑问 我注意到 当我创建一个 Resources 对象时 我所要做的就是 Resources res getResources 第一个疑问是为什么我必须这样做并且我不
  • 如何从facebook sdk获取用户生日?

    如何通过以下方式获取用户生日user getBirthday Session openActiveSession this true new Session StatusCallback callback when session chan
  • 处理 vimrc 时检测到错误: - 如何在 vim 中获取 pugins

    今天我正在制作自定义 vimrc 但它给了我这个错误 它不允许我使用任何插件 有人可以帮助告诉我做错了什么吗 这些行是它显示的错误 E117 Unknown function plug begin line 10 E492 Not an e
  • 无法安装react-beautiful-dnd包

    以下是安装包时的完整错误堆栈消息 npm ERR code ERESOLVE npm ERR ERESOLVE unable to resolve dependency tree npm ERR npm ERR While resolvin
  • 用户更新标签后渲染 Highcharts

    我正在尝试创建一个图表生成器 我有用户输入的图例标题和位置 我希望用户输入标题 当单击 模糊 时 图表将根据他们输入的内容进行更新 问题是图表第一次渲染 但是我永远无法让字符再次渲染 这是代码的快速摘要 legendlocation sel
  • 根据验证程序,远程证书无效[重复]

    这个问题在这里已经有答案了 运行以下代码 我得到一个异常 using var client new Pop3Client client Connect provider ServerWithoutPort provider Port tru
  • WCF 服务主机和 Silverlight 5 通过 net.tcp 的跨域策略文件

    我有一个本地托管的 WCF 服务和一个与之通信的 silverlight 5 应用程序 默认情况下 silverlight 在调用 WCF 服务时尝试通过 HTTP 获取跨域策略文件 我需要更改此设置 以便策略文件通过 net tcp 端口
  • android art 运行时 check_jni.cc 包名称错误

    编辑 由于 build gradle 不明确 我有太多版本的共享库 src main jniLibs armeabi v7a libaudioboo native so rob app rm src main libs armeabi v7
  • MSI 卸载问题:错误 1001 -> 保存的状态字典包含不一致的数据并且可能已损坏

    我需要创建一些 Windows 服务 显然我想将它们打包在一个不错的安装程序中 由于我不熟悉服务创建 安装 我基本上使用了以下示例中的代码 高级服务安装 我没有更改 ProjectInstaller 或 InstallActions 基本上
  • 获取特定层次结构级别的元素

    有没有办法使用 XPath 检索特定层次结构级别的所有元素 Upd a b 1 b b 2 b a
  • Android 中的运行时异常 java.lang.NoClassDefFoundError:retrofit2.Platform

    实施改造后 我正在使用 Rtofit 处理来自移动设备的服务器端数据 我收到以下异常任何了解此问题的人请告诉我哪里做错了 初始化改造 mRetrofit new Retrofit Builder baseUrl AppConstance A
  • 使用模板类的函数模板专业化[重复]

    这个问题在这里已经有答案了 可能的重复 函数模板的部分特化 我无法在任何地方找到我的问题的解决方案 因为如果我使用我提出的关键字进行搜索 将为我提供适合不同问题的解决方案 我知道这一定是以前问过的 只是找不到解决方案 假设我有一个函数模板
  • 如何在Matlab中用contourf模拟并绘制电场?

    我想知道如何绘制具有 2 个电荷 Q 和 Q 及其总 E 的图 对于特定点 例如 4 5 轮廓为 f 我的M文件实际上扫描了该区域 从 3x到3x 并计算每个点的E 将其存储在表中 但在此之后 我不知道如何使用contourf来绘制它 sy
  • android中视频文件的加密与解密

    谁能告诉我如何在从服务器下载时加密视频文件并在应用程序内播放时解密它 请帮忙 谢谢 Use 密码输出流 and 密码输入流用于android中文件的加密和解密 有两种方法可以帮助您实现目标 下载文件并对其进行加密 当您想播放该文件时 将其解
  • 使用 T-SQL DATEFROMPARTS 返回 NULL 而不是抛出错误

    我经常收到一些整数组合或单个 8 位整数形式的日期 为了将它们转换为可用的日期 我尝试了 DATEFROMPARTS 函数 但是当日期无意义时 当首选 NULL 时 它会抛出错误 我希望找到一个与 TRY PARSE 行为类似的函数 它接受
  • MVC 4:如何使 DropDownListFor 返回 0 作为 optionLabel 值?

    我有一个包含多个 DropDownListFor 的创建视图 每次创建新对象时 只有 1 个 DropDownListFors 应该有值 我希望其他对象在选择 optionLabel 时返回 0 作为结果 如何将 0 指定为 DropDow
  • Angular 2 使用 *ngIf 和布尔值隐藏和显示元素

    我想通过使用位于另一个组件中的按钮来显示和隐藏元素 所以我有一个仪表板 里面有很多室和一个标题 带有 app header 和 app chamber 的 DashboardComponent 的 HTML