这是我的angular2代码 .
模板
<div #picker class="slider">
<div class="slider-track">
<div #sliderSelectionEl class="slider-selection"></div>
<div #sliderHandle1 class="slider-handle"></div>
<div #sliderHandle2 class="slider-handle"></div>
</div>
<div #tooltipEl class="tooltip">
<div class="tooltip-arrow"></div>
<div #tooltipInner class="tooltip-inner"></div>
</div>
<input type="text" class="span2" value="" id="sl2">
</div>
零件
import {Component, OnInit, Input, ViewChild, ElementRef, Renderer} from '@angular/core';
export class SliderComponent implements OnInit {
@ViewChild('picker') picker: ElementRef;
constructor(private renderer: Renderer, private el: ElementRef) {
}
ngAfterViewInit() {
this.renderer.setElementClass(this.picker.nativeElement, 'slider-horizontal', true);
console.log(this.picker.nativeElement.offsetWidth);
console.log(this.picker.nativeElement.offsetHeight);
}
}
.slider-horizontal {
width: 210px;
height: 20px;
}
问题是每次加载的打印值都不同 . 我猜这个问题是由于浏览器还没有完成加载div . 你知道这个解决方案是什么吗?
2 回答
您可以使用检测大小更改
MutationObserver
以下是如何使用它来检测元素的变化:
对于您的情况,您可以在
ngAfterViewInit
内使用它并刷新偏移量 . 您可以更具体,只检测一些突变,然后才能提取偏移量 .more info :
doc:https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver
兼容性:https://caniuse.com/#feat=mutationobserver
Demo :
您必须在渲染周期后安排对'offsetWidth'的调用,角度执行在微任务队列结束时绘制,因此您可以尝试
setTimeout(..., 0)
或在zonejs之外运行Promise.resolve().then(...)
. 希望能帮助到你 .