【问题标题】:Angular2 AfterViewChecked not firing on a directive when binding is complete on RC4在 RC4 上完成绑定时,Angular2 AfterViewChecked 不会触发指令
【发布时间】:2016-11-24 05:18:59
【问题描述】:

我有一个 Angular 2 指令,当表格放置在可滚动的 div 中时,它使给定表格的标题(th)保持固定。它根据单元格上数据的大小调整列标题的大小,反之亦然。在 Angular 2 RC1 之前它工作正常,但在我将它升级到 RC4 后它停止工作。

一段时间后,我意识到框架触发的“AfterViewChecked”事件的数量已经减少,可能是由于某个问题已得到修复。现在的问题是我的指令不再触发其重新计算逻辑来调整表头的大小。

是否可以绑定或捕获父指令表中的事件以触发重新计算过程?

指令代码或多或少是这样的:

export class TableFixedHeaderDirective implements AfterViewChecked, AfterViewInit
...
ngAfterViewInit(): void ...
ngAfterViewChecked(): void ...
onWindowResize(): void ...
...

在这些事件中,我调用逻辑来执行标题计算,这将基本上调整标题或列的大小,具体取决于正在显示的数据的宽度。

【问题讨论】:

    标签: angular angular2-directives


    【解决方案1】:

    角度指令没有视图,因此所有与视图相关的生命周期钩子都不起作用,因为它们不存在。

    docs

    指令和组件

    ngOnInit
    在 Angular 初始化数据绑定输入属性之后初始化指令/组件。

    ngOnChanges 在 Angular 设置数据绑定输入属性后响应。该方法接收当前值和先前值的更改对象。

    ngDoCheck
    检测 Angular 可以或不会自行检测到的变化并采取行动。调用每次更改检测运行。

    ngOnDestroy 在 Angular 销毁指令/组件之前进行清理。取消订阅 observables 并分离事件处理程序以避免内存泄漏。

    仅组件

    ngAfterContentInit
    在 Angular 将外部内容投射到其视图中之后。

    ngAfterContentChecked
    在 Angular 检查它投射到其视图中的外部内容的绑定之后。​​

    ngAfterViewInit 在 Angular 创建组件的视图之后。

    ngAfterViewChecked
    在 Angular 检查组件视图的绑定之后。​​

    【讨论】:

    • 关键是它们以某种方式被调用。页面完全加载后,如果我点击页面上的任意位置,就会触发指令上的 ngAfterViewChecked 事件,并按预期进行计算。问题是我需要在数据绑定到表并添加新行之后触发它。我设法通过使用 settimeout 使其工作,在 1 秒后调用 ChangeDetectorRef.detectChanges(),但这似乎不是一个好的解决方案。
    • 你是对的!文档是误导和错误的......或者它是一个角度问题,但我打赌错误的文档。无论如何,您可以在组件和指令之间进行通信,但是如果您可以提供更多详细信息,也许可以提供更多代码,以便我可以看到结构...顺便说一句,请注意,在指令中您无法控制更改检测策略,这是由主机组件设置的...
    • 我打开了一个问题,让我们看看他们怎么说,我会相应地编辑我的答案。 LINK
    • 谢谢@Shlomi!让我们从中得到什么。
    • 嘿,因为您的答案很旧,我不知道当时是否有所不同。但截至今天,带有元素选择器的指令确实具有内容生命周期。 @angular/material 一直在使用它。
    猜你喜欢
    • 2017-02-02
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 2011-01-17
    • 1970-01-01
    • 2015-11-22
    • 1970-01-01
    相关资源
    最近更新 更多