Angular ViewChildren 不会立即看到 ngFor 中的所有子级

2023-11-26

我有一个奇怪的行为 @ViewChildren 对应于 ngFor 生成的子组件。 @ViewChildren 查询没有看到元素在数组中停留了很长时间。我所有的代码都在Plunker- 打开控制台后查看。

这是我的主要组成部分:

@Component({
    selector: 'my-app',
    template: `
        <button (click)="addInternalComponent()">Add internal component</button>
        <app-internal #internals *ngFor="let i of indexes" [index]="i
(afterViewInit)="onAfterViewInit()"></app-internal>
    `,
})
export class App {
    @ViewChildren('internals') internals: QueryList<InternalComponent>;
    indexes = [];
    addInternalComponent() {
        console.log('adding internal component!');
        this.indexes.push(this.indexes.length);
        console.log('Not complete list', this.internals._results);

    }

    onAfterViewInit() {
        console.log('onAfterViewInit - still not complete list', this.internals._results);
    }
}

我们可以通过单击按钮添加其中的子组件。

在将一个元素添加到索引数组中以生成 ngFor 循环中的所有子元素之后 - 我们没有刚刚添加的那个元素。

我可以理解这种行为 - 因为也许子组件需要一些时间来创建它,并且引擎决定在创建完整的子组件之前控制台日志。

但是,我在子组件中创建了发射器,表示子组件的视图和模型都已初始化。但是......在父组件中处理这个事件 - 我们仍然没有这个项目。这怎么可能?

子组件:

export class InternalComponent implements AfterViewInit {
  @Input()
  index;
  @Output()
  afterViewInit: EventEmitter<any> = new EventEmitter<any>();

  ngAfterViewInit() {
    this.afterViewInit.emit();
  }

}

通知内容的标准方式QueryList已经改变的是订阅它的changes事件在ngAfterViewInit:

@ViewChildren("internals") internals: QueryList<InternalComponent>;

ngAfterViewInit() {
  this.internals.changes.subscribe((list: QueryList<InternalComponent>) => {
    // The updated QueryList is available here (with list or with this.internals)
    this.doSomethingWithInternals(list);
    this.doSomethingWithNewInternal(list.last);
    ...
  });
}

上面的事件处理可能就是您所需要的。如果您仍想实施afterViewInit事件在InternalComponent,您可以传递对组件的引用作为事件的参数:

export class InternalComponent implements AfterViewInit {
  @Output() afterViewInit = new EventEmitter<InternalComponent>();

  ngAfterViewInit() {
    this.afterViewInit.emit(this);
  }

}

并在事件处理程序中检索组件:

(afterViewInit)="onAfterViewInit($event)"

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

Angular ViewChildren 不会立即看到 ngFor 中的所有子级 的相关文章

  • 无法分配给对象“#”的只读属性“detachedCallback”

    我安装了A Frame https github com aframevr aframe by npm install aframe save 当我使用时 import aframe or use require aframe import
  • [karma-server]:类型错误:无法读取未定义的属性“范围” - CI 环境中的 Angular 单元测试

    我们的 CI CD 管道停止处理 ng test 作业并失败并显示以下错误消息 karma server TypeError Cannot read property range of undefined at handleRangeHea
  • 使用 AngularFire 从 Firestore 过滤数据

    我正在尝试使用 Angularfire 的查询集合从 Firestore 过滤数据 https github com angular angularfire2 blob master docs firestore querying coll
  • mat-table 中每行的 formGroup 数组

    我有一个 formGroup 数组 其中每个元素代表一个表单 接下来我有一个 mat 表 我想要做的是将每个 tr 即每一行 生成为不同的表单 以便表的第 i 行链接到第 i 个 formGroup 因此 在第 i 行内 每个 td 元素都
  • gyp ERR,Npm 无法获取本地颁发者证书

    我正在致力于 Windows 10 的全新安装 唯一的事情是我安装了 cygwin 以在 cmd 中获取 unix 命令 当我打字时npm install g angular cli它下载了必要的文件 但我收到错误 gyp ERR conf
  • 两个服务如何以双向方式相互通信?

    一种是通过事件 另一种是通过调用方法 我试图在我的应用程序中实现聚合模式 我有 AuthService 在这里我处理身份验证结果并发出事件 if auth this eAuth emit true else this eAuth emit
  • 使用 Angular 4 将新行添加到 mat-table 中

    如何从输入字段手动将新行添加到 Angular Material 表中 请看这张图片 如果我添加状态名称和状态代码 它应该出现在下表中 请帮助我如何使用 Angular 4 来实现它 我整理了一个简单的示例 应该可以很好地提示您从哪里开始
  • Angular 2 Observable 具有多个订阅者

    我有一个 Angular 2 服务 可以从 API 获取数据 该服务有 3 个订阅者 在组件中定义 每个订阅者都对数据执行其他操作 不同的图表 我注意到我正在向 API 发出三个 GET 请求 而我想要实现的是一个请求 并且订阅者将共享数据
  • Angular 5 中使用 rxjs 进行持久订阅

    我对 Angular 5 中的 rxjs 仍然有点陌生 并且很难表达我的问题 我仍然希望得到一些提示 我经常会得到相同的设置 多个组件显示相同的数据 访问数据的单个服务 现在通过 Observables 接收数据时我有 2 个选择 a 订阅
  • 在请求标头中设置 Cookie Angular2

    我是 angular2 的新手 我的服务器 spring 在其响应标头中使用 set cookie 值来响应身份验证 如何将该 cookie 设置为下一次 API 调用的请求标头 我搜索了很多 但找不到合适的解决方案 作为http get
  • Angular4 - 滚动到锚点

    我正在尝试对同一页面上的锚元素进行简单的滚动 基本上 用户点击 尝试 按钮 它就会滚动到页面下方 ID 为 登录 的区域 现在 它正在与一个基本的id login a href login a 但它正在跳转到该部分 理想情况下 我希望它滚动
  • 显示在 Angular 5 中作为 Blob 对象接收的图像

    我正在开发一个 MEAN Stack 应用程序 我想做的是显示存储在数据库中的图像 这样后端就可以工作 但我真正的问题是在前端Angular所以我这样做了 首先从后端接收图像 我做了一个服务来做到这一点 Function to get us
  • 如何在 TypeScript 中禁用/抑制库中的错误?

    我打开了一些编译器开关来报告代码中的更多问题 例如严格的空检查 但我在使用的库中遇到了数十个错误 例如 default xxx node modules angular core src util decorators d ts 11 5
  • Angular2 与 Jquery-ui 滑块

    我尝试将 Jquery ui 滑块与 angular2 一起使用 我想让变量 slideValue 显示滑块的值 但我不知道如何将我的模型或变量从角度绑定到滑块 这是我的滑块组件 import Component ElementRef In
  • 在 Angular 9 应用程序的生产中同时使用 AOT 和 JIT

    因此 我一直在构建一个 Angular 9 应用程序 其中有一个客户仪表板来管理保存在服务器上的模板 这些模板可以通过激活系统在不同的设备上查看 因此设备与用户绑定 所以让我们说https templates com我们有 login da
  • Angular - 为每个请求设置标头

    我需要在用户登录后为每个后续请求设置一些授权标头 要为特定请求设置标头 import Headers from angular2 http var headers new Headers headers append headerName
  • Windows 10 中的 npm 安装错误( npm install -g angular-cli )

    node v v4 5 0 npm v 5 0 1 有人在 Windows 10 中安装 angular cli 时遇到过这种问题吗 请尝试以下操作 step 0 运行这个命令 npm uninstall g angular cli npm
  • 角度 4 单击按钮功能未触发

    我正在尝试检查文本输入是否为空或不在角度 4 中 我没有为此使用表单 这只是一个输入字段 当我在下面的按钮中执行 addLocaton 函数时 需要进行检查 我的输入字段
  • Angular 5 - 在加载数据之前停止未定义对象的错误

    防止控制台中因仍未定义的对象而出现错误的最佳方法是什么 假设我有这个 name string constructor private data DataService this data name subscribe res gt this
  • 全局未在 ../node_modules/socket.io-parser/is-buffer.js 中定义

    预先感谢您帮助我 我正在尝试在我的一个角度组件中连接套接字 但在浏览器的控制台中它会抛出一个错误 指出 Global 未在 Object node modules socket io parser is buffer js 中定义 这是我的

随机推荐

  • Firebase 查询子级的子级是否包含值

    表的结构是 chats gt 随机ID gt gt 参与者 gt gt gt 0 名称1 gt gt gt 1 名称2 gt gt 聊天项目 etc 我想做的是查询聊天表 以查找通过传入的用户名字符串容纳参与者的所有聊天 这是我到目前为止所
  • Kafka高级消费者使用Java API从主题获取所有消息(相当于--from-beginning)

    我正在使用 Kafka 站点上的 ConsumerGroupExample 代码测试 Kafka High Level Consumer 我想检索 Kafka 服务器配置中有关 测试 主题的所有现有消息 查看其他博客 auto offset
  • 在多个 GridViewColumn 中使用通用 DataTemplate

    我有一个显示一些值的 GridView
  • 跨平台方式检测符号链接/连接点?

    在java中 可以通过比较文件的规范路径和绝对路径来检测Unix环境中的符号链接 然而 这个技巧在 Windows 上不起作用 如果我执行 mkdir c foo mklink j c bar 从命令行 然后在java中执行以下几行 Fil
  • 怪异模式与 2011 年相关吗?

    随着IE9 FF4 不断更新的chrome等所有最新的浏览器 我们还需要怪异模式吗 如果有的话有什么用处 在什么场景下 Quirks 模式旨在允许 很多 较旧的网站在 相对 较新的浏览器中运行 新的开发永远不应该在 Quirks 模式下进行
  • ListView 图像的 onClick 侦听器 - Android

    我有一个ListView右侧有图像 我想表演一个onClick通过单击图像上的侦听器事件ListView 请参阅图片以供参考 我知道基本的OnClick监听器实现 但这对我来说似乎有点棘手 P 忘了说了 点击实际ListView将启动一项新
  • 使用 DbContext.Database.SqlQuery 在 EntityFramework 中进行预加载

    在 EF 4 中 我可以通过编写 sql 来预先加载导航属性吗DbContext Database SqlQuery or DbContext Set
  • 在 Mac OS 10.11 (El Capitan) 上使用 pfctl 转发端口

    我目前正在测试我的开发环境是否可以在即将推出的新 Mac OS 10 11 上运行 以及是否可以在发布后立即升级 在我的测试机器上 我当前正在运行 Beta Preview 3 一切似乎都运行良好 我只能得到pfctl转发我的端口 我使用
  • Angular 模板中的 Javascript 广告

    我正在尝试在 Angular 模板中呈现 Javascript 广告 但它不会显示 当他们将 Javascript 附加到 head 标签时 我找到了一些解决方案 但我希望将广告放置在我的 Html 正文内 中 这是一个笨蛋 https p
  • TestNG 选项未显示在 Eclipse 的 RunAs 选项中

    我在 Eclipse IDE 中使用 Maven 项目 并添加了一个 testng 依赖项
  • 如何使用网络浏览器在链接列表中导航?

    我有一个网址列表 我需要导航它们 如何确保每个 url 都会调用 DocumentCompleted 事件 我已经尝试创建许多线程并尝试使用单个线程 但应用程序仍然没有为每个 url 触发事件 DocumentCompleted 有没有办法
  • 如何在 Release() 上释放 NET COM 互操作对象

    我有一个用托管代码 C CLI 编写的 COM 对象 我在标准 C 中使用该对象 当 COM 对象被释放时 如何强制立即调用 COM 对象的析构函数 如果不可能 请调用 I have Release 在我的 COM 对象上调用 MyDisp
  • 通过 HTTPS 投放广告

    我知道不存在愚蠢的问题 但这是 您可以通过 adsense 或其他完全支持 https 的网站上的其他方式提供基于上下文的广告吗 Update 我们更新了 AdSense 广告代码 现在支持通过安全超文本传输 协议 HTTPS 网页上的安全
  • 使用jquery获取keyup位置[重复]

    这个问题在这里已经有答案了 可能的重复 如何获取文本区域中的插入符位置 如果我在 html textarea 控件中的任何位置键入 我需要获取 keyup 事件的当前位置 例如 Welcome to jQuery 所以我在 欢迎 之后有 表
  • 将本体与 Protege-OWL API 合并

    我使用 protege 创建了两个本体 并保存为 A owl B owl 我知道protege 4 0可以合并很多本体 我想使用protege owl API将本体A owl和B owl合并到C owl 但我不知道该怎么做 你可以帮帮我吗
  • 以最少的配置使用 Unity

    在工作中 我们经常使用Unity 它的工作非常出色 但是您使用它的次数越多 您的配置文件就会增长得越多 运行时问题也会增加得越多 并且您必须为每个测试项目重新创建统一配置的次数就越多 因此 我们最终得到了一个巨大的统一配置部分 必须在多个项
  • 在 Posix 中如何使用 dev_t 类型?

    我追求的是这种类型的含义以及什么接口可以使用它 Posix 规范中解释说dev t用于设备 ID 但是 对于路径所描述的任何对象 可以是文件 目录 fifo 或物理设备 来说 设备 id 意味着什么 例如 调用stat 应为您提供一个包含此
  • 将类添加到单击的元素

    我正在尝试向单击的元素添加一个类 有多个具有唯一 ID 的元素 因此我 不知道 元素的 ID 是什么 我可以使用以下代码的修改版本来实现此目的吗 Jquery document ready function this on click fu
  • 我如何在 iOS 5 中使用 CMDeviceMotion 获取设备的标题

    我正在使用陀螺仪开发 AR 应用程序 我使用了苹果代码示例公园 它使用旋转矩阵来计算坐标的位置 而且效果非常好 但现在我正在尝试实现一个 雷达 我需要根据设备航向来旋转它 我正在使用 CLLocationManager 标题 但它不正确 问
  • Angular ViewChildren 不会立即看到 ngFor 中的所有子级

    我有一个奇怪的行为 ViewChildren 对应于 ngFor 生成的子组件 ViewChildren 查询没有看到元素在数组中停留了很长时间 我所有的代码都在Plunker 打开控制台后查看 这是我的主要组成部分 Component s