我将 Bootstrap 用于我的布局,我需要检查我的自动计算大小是否div
与 bootstrap 一起改变,例如 width = 25%。
如何对我未在模板中设置但由 Bootstrap 设置的属性执行更改检测?
(window:resize)
是不足够的。
我将 Bootstrap 用于我的布局,我需要检查我的自动计算大小是否div
与 bootstrap 一起改变,例如 width = 25%。
如何对我未在模板中设置但由 Bootstrap 设置的属性执行更改检测?
(window:resize)
是不足够的。
您可以将指令添加到div
并实现生命周期挂钩ngDoCheck()
以执行您自己的更改检测逻辑。你需要注入ElementRef
:
constructor(private _elRef:ElementRef) {}
ngDoCheck() {
// use ElementRef to examine the div property of interest
如果在div
组件模板内,则添加本地模板变量
<div #myDiv ...>
然后用于@ViewChild()
获取对div
和实现生命周期挂钩的引用ngDoCheck()
或ngAfterViewChecked()
执行您自己的更改检测逻辑。
@ViewChild('myDiv') theDiv:ElementRef;
ngAfterViewChecked() {
// use this.theDiv to examine the div property of interest
请注意,每次更改检测运行时都会调用 ngDoCheck() 和 ngAfterViewChecked()。另请参阅开发指南Lifecycle Hooks。
我遇到了同样的问题,所以我使用了名为 Angular-Resize-Event 的轻量级库
https://www.npmjs.com/package/angular-resize-event
<div (resized)="onResized($event)"></div>
安装后,只需将此输出事件添加到您要检查大小更改的任何 div 中。
我已经尝试了正确的答案,但刷新率不是很准确,所以我寻找了另一种解决方案。
这里是
// Directive
@Directive({
selector: '[resize-detector]',
})
public constructor(public element: ElementRef<HTMLElement>) {}
public ngOnInit(): void {
// Call detectResize as whe the element inits the windows resize event most likely won't trigger
this.detectResize();
}
// if you need the windowDimensions add ", [$event]" to @HostListener and pass event to detectResize(event)
@HostListener('window:resize')
public detectResize(): void {
console.log(element.nativeElement.offsetWidth);
console.log(element.nativeElement.offsetHeight);
// Do you magic here ...
}
然后您可以在任何元素中使用它,例如:
<app-component resize-detector></app-component>
跟踪 DOM 属性更改的方法很少:
setInterval
DOMAttrModified
+ propertychange
for IEMutationObserver