如何正确地等待元素获得正确的宽度,然后在Angular 2中访问它
How to correctly wait for the elements to get their correct width before accessing it in Angular 2?
我试图使按钮具有相同的宽度,但在访问按钮宽度之前,我在等待Angular 2完成所有渲染和其他操作时遇到了问题。
我尝试使用"有效"的DoCheck
,我所说的"有效"是指它确实获得了正确的宽度值,但这只是第二次运行时。
由于某种原因,NgDoCheck
运行了两次,一旦我添加button.style.width = widest + 'px';
语句,所有按钮的宽度都将为115px
,因此第二次运行ngDoCheck
时,它将再次遍历所有按钮,但这次所有按钮都将设置为115px
,因此widest
永远无法成为159px
的正确值,因为我们在第一次运行ngDoCheck
时设置了该值。
解决这个问题的正确方法是什么?使用DoCheck
似乎是错误的,因为它运行了两次,而且我并没有真正检查输入值,这是DoCheck
在阅读文档时的用例。
export class ButtonGroupComponent implements DoCheck {
constructor(private _elementRef: ElementRef) {}
ngDoCheck() {
if (this.equalWidth) {
let buttons = this._elementRef.nativeElement.getElementsByTagName('button');
let widest = 0;
for (var button of buttons) {
if (button.getBoundingClientRect().width > widest) {
widest = button.getBoundingClientRect().width;
}
}
for (var button of buttons) {
button.style.width = widest + 'px';
}
}
}
}
使用AfterViewInit
似乎可以做到这一点,它只执行一次,从而产生正确的行为和正确的值。这就像将DoCheck
和ngDoCheck
替换为AfterViewInit
和ngAfterViewInit
:一样简单
export class ButtonGroupComponent implements AfterViewInit {
constructor(private _elementRef: ElementRef) {}
ngAfterViewInit() {
if (this.equalWidth) {
let buttons = this._elementRef.nativeElement.getElementsByTagName('button');
let widest = 0;
for (var button of buttons) {
if (button.getBoundingClientRect().width > widest) {
widest = button.getBoundingClientRect().width;
}
}
for (var button of buttons) {
button.style.width = widest + 'px';
}
}
}
}
希望这能帮助其他人进行DOM操作。
相关文章:
- 使用Angular存储用户以前是否选中过复选框,然后再调用它的最佳方式是什么
- 先在Angular中加载配置文件,然后再加载其他文件
- Angular$http然后解析_.each中的多个调用
- 找到 JSON 数组的特定部分,然后在 Angular 中更深入
- Angular js,在选择元素上,我想 POST 数据以将其保存在数据库中,然后我想使用 PUT 更新它而无需重新加载
- 如何正确地等待元素获得正确的宽度,然后在Angular 2中访问它
- Angular$q然后地狱
- 在Angular中,我如何删除“;选择“;从一个李开始上课,然后把它应用到一个新的李身上
- Angular.js-先运行服务函数,然后再运行其他函数
- 有条件地添加类,然后将其永久设置为Angular
- Angular JS promise/defer:使用框架Quickblox,如何上传图像,然后将公共url上传到自定义
- 在数组中找到值,然后用Angular forEach返回true
- 使用Angular将请求传递给DJANGO REST api,然后在DJANGO视图中返回这些结果
- 添加新的选择,然后在angular中添加选择数组
- Angular,禁用一个按钮,然后在javascript中使用setTimeout激活它
- Angular的ng-click会在ng-repeat中更新$scope,然后使用$apply来更新dom
- Angular - ngAnimate - Animate.项目首先显示,然后动画开始
- Angular承诺:拦截“然后”
- Angular JS从Ajax分配到作用域,然后计算
- Angular/Java Script-reference”;类“;属性,然后再实例化对象