Angular 4 在 @ViewChild 上使用 setter

2024-06-19

我有一个演示here https://stackblitz.com/edit/angular-dgmnlf?file=app%2Fchild.component.ts

我正在尝试使用 *ngIf 将元素添加到 DOM 后获取该元素的高度

我试图通过在 @ViewChild 上使用 setter 来做到这一点,该 setter 应该被称为 *ngIf 变为 true 的一个。

在我的示例中,它似乎仅在添加然后删除元素(单击按钮两次)时才起作用。

当元素首次显示时,如何才能使其工作。

我知道我可以使用 [hidden] 而不是 *ngIf 来做到这一点,但我的实际代码有很多我不想立即放入 DOM 中的元素

import { Component, Input, ElementRef, ViewChild } from '@angular/core';

@Component({
  selector: 'child-comp',
  templateUrl: './child.component.html'
})

export class ChildComponent{

  @Input() parent: ElementRef;

  private blockThree: ElementRef;

  @ViewChild('blockThree') set content(content: ElementRef) {
    this.blockThree = content;
  }

  showThree: boolean = false

  blockHeightThree: number

  constructor(){ }


  showBlockThree(){
    this.showThree = !this.showThree
    this.blockHeightThree = this.blockThree.nativeElement.clientHeight;
    console.log('element height '+this.blockHeightThree);
  }

}

它只能第二次起作用的原因是this.showThree = !this.showThree不会立即调用 setter,因为整个函数首先完成,然后 Angular 才真正检测到更改并将元素放置到位。如果您将高度读取逻辑移至设置器中,它将起作用。

这意味着你无法阅读blockHeightThree in the showBlockThree函数,因为第三块还不存在。但有一个不优雅的解决方案。你可以把setTimeout()在那里,高度是异步读取的。也许它会满足你的需要。

工作演示 https://stackblitz.com/edit/angular-7qw9q5?file=app/child.component.ts

    @ViewChild('blockThree') set content(content: ElementRef) {
      console.log("block three", content)
      this.blockThree = content;
      if (this.blockThree) {            
        this.blockHeightThree = this.blockThree.nativeElement.clientHeight;
        console.log(this.blockThree.nativeElement.clientHeight);
       }
    }

    showBlockThree() {
      this.showThree = !this.showThree
      console.log('element height ' + this.blockHeightThree);
      setTimeout(()=> console.log("async block three", this.blockHeightThree));
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Angular 4 在 @ViewChild 上使用 setter 的相关文章

随机推荐

  • 如何在上一级目录创建文件?

    如何在 python 上一级目录中创建文件 而不使用完整路径 我想要一种既适用于Windows又适用于Linux的方法 Thanks Use os pardir 这可能总是 import os fobj open os path join
  • PHP 中的 Europe/London 和 UTC 有区别吗? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我知道 UTC 和 GMT 实际上是
  • 使用 Android/Firebase 实时数据库时,Single.Create()...blockingGet() 在 RxJava 2.1.3 中挂起

    当使用以下模式从Firebase实时数据库同步获取数据时 String s Single create new SingleOnSubscribe
  • 将两个字符的字符串转换为布尔数组的快速方法是什么?

    我有一个很长的字符串 有时超过 1000 个字符 我想将其转换为布尔值数组 它需要非常快速地多次执行此操作 let input String 001 let output Bool false false true 我天真的尝试是这样的 i
  • 如何在颠覆合并期间忽略文件夹

    我有一大堆更改需要合并到我的分支中 但我想在合并过程中忽略特定文件夹 是否可以使用 Subversion 来做到这一点 如果是这样那我该怎么办呢 编辑 我想忽略的文件夹位于存储库中 但在合并期间我不会对此文件夹进行更改 您可以像平常一样进行
  • Netstat不显示docker暴露的端口

    因为某些原因netstat没有列出 docker 暴露的端口 按照建议here https stackoverflow com questions 36454955 docker and netstat netstat is not sho
  • 按名称获取多个 pandas 列的索引

    我想获取选定的 pandas 数据框列的数字索引 对于一列来说 这非常简单 nonzero df columns values conditionA 但有多个元素 我有一些有用的东西 但很冗长和巨大 df pd DataFrame colu
  • tc netem 中的选项限制是什么意思和作用?

    我正在尝试使用命令模拟慢速网络链接tc I use netem模拟延迟和丢包 htb 模拟窄带宽 但我发现有一个限制选项netem 这个选项有什么作用 会影响最终的带宽吗 我用谷歌搜索并找到了一些东西http manpages ubuntu
  • 使用 statsmodels 忽略多重 OLS 回归中的缺失值

    我正在尝试使用 statsmodels 和 pandas 数据框运行多重 OLS 回归 不同行的不同列中缺少值 并且我不断收到错误消息 ValueError 数组不得包含 infs 或 NaN 我看到了这个问题 它很相似 但并没有完全回答我
  • 从 float 转换的 Ruby Time 对象不等于原始 Time 对象

    time Time now fvalue time to f return time Time at fvalue 有人可以解释为什么上面的表达式返回 false 吗 如何从 float 创建一个与原始时间变量匹配的新 Time 对象 Th
  • 将我的应用程序部署在 Tomcat 的根目录下

    我有我的应用程序的战争文件 我需要在根级别部署它 当前的网址是http localhost 8080 war name application name 您有几个选择 取出开箱即用的ROOT 从 tomcat 目录并将您的 war 文件重命
  • Spring Security 通过并发登录尝试将用户锁定

    我是安全新手 遇到了一个问题 该问题导致用户帐户被锁定 只有重新启动应用程序才能修复它 我有一个带有 spring security 4 0 2 RELEASE 应用程序的 spring boot 1 3 0 BUILD SNAPSHOT
  • 如何使用 Google 脚本将数据添加到 Google 表格中的特定行

    在我的 Google 表格中 我将索引放在名为 colorRow 的变量中 我只是想向工作表中的该行添加一些数据 但数据不断进入页面下方的其他行 我究竟做错了什么 var data Some more fields in data arra
  • Google Data Studio - 刷新嵌入式网站上的数据

    我已在 html 页面上嵌入了 data studio 报告 我在一段时间后刷新 iframe 但报告没有更新 嵌入页面上的报告只能通过访问数据工作室网站上的报告并单击 刷新数据 图标来更新 如何在不手动点击 Data Studio 网站上
  • 交替 div 使图像向左(偶数)或向右(奇数)

    我正在尝试更好地排列图像 而不仅仅是一列中的图像 请参阅附件中的示例 每篇文章的图像可以位于左侧和右侧 这是我的代码 HTML section class content list page section
  • 如何在不循环的情况下添加组ID?

    我有数据框 例如 productid ordernum p1 10 p2 20 p3 30 p4 5 p5 20 p6 8 我想添加另一列 称为 groupid 它将产品按顺序分组在一起 一旦 sum ordernum 达到 30 分配一个
  • Numba 环境变量未通过 .numba_config.yaml 设置[重复]

    这个问题在这里已经有答案了 可以为 numba 设置一些环境变量 如文档中指定的 https numba pydata org numba doc dev reference envvars html https numba pydata
  • 快速有效地计算已知特征值的特征向量

    我的问题的简短版本 计算矩阵特征向量的最佳方法是什么A 如果我们已经知道属于特征向量的特征值呢 更长的解释 我有一个很大的随机矩阵A由于它是随机的 因此具有非负左特征向量x 这样A Tx x 我正在寻找快速有效的方法来数值计算这个向量 最好
  • iPad 2 检测

    由于我没有 iPad 2 因此我需要知道调用 UIDevice currentDevice model 时它返回什么 我以为它只返回 iPad 但看来我错了 有人可以告诉我吗 Thanks 检查是否有带摄像头的 iPad BOOL isIP
  • Angular 4 在 @ViewChild 上使用 setter

    我有一个演示here https stackblitz com edit angular dgmnlf file app 2Fchild component ts 我正在尝试使用 ngIf 将元素添加到 DOM 后获取该元素的高度 我试图通