【问题标题】:Get the width, height and offset of clicked div - Angular 2获取点击的 div 的宽度、高度和偏移量 - Angular 2
【发布时间】:2017-07-21 10:23:16
【问题描述】:

我有一个模板,它使用*ngFor 和一个单独的 div 元素创建链接列表,我想根据当前活动链接更改其位置。

模板:

<div #divHandle
    *ngFor="let link of links; let i = index"
    class="div-link"
    (click)="changeActiveLink(i)">
    <h2>{{link}}</h2>
</div>
<div
[@indexState]="activeLink"
id="highlighter"></div>

这会产生如下结构:

<div class="div-link">
  <div (click)="changeActiveLink(0)"><h2>Link 1</h2></div>
  <div (click)="changeActiveLink(1)"><h2>Link 2</h2></div>
  <div (click)="changeActiveLink(2)"><h2>Longer link 1</h2></div>
  <div (click)="changeActiveLink(3)"><h2>Longer link 2</h2></div>
</div>
<div id="highlighter"></div>

我希望我的荧光笔 div 在activeLink = 0 时获得Link 1 的宽度。类似于这个普通的js:

var High = document.getElementById('highlighter');
High.style.width = document.getElementsByClass('div-link')[0].children[activeLink].offsetWidth; //activeLink = 0

在我的app.component.ts 文件中:

import { Component, AfterViewInit, ViewChildren, Directive, QueryList, ElementRef} from '@angular/core';

@Directive({selector: '[class~=div-link]'})
@Directive({selector: '.div-link'}) // variant
@Directive({selector: '#divHandle'}) // variant
@Directive({selector: '[divHandle]'}) // variant
export class ChildDirective {
    constructor(elem: ElementRef){}
}

@Component({
    selector: 'my-app',
    ...
})
export class AppComponent implements AfterViewInit {
    @ViewChildren(ChildDirective) childrenContent: QueryList<ChildDirective>;

    ngAfterViewInit(){
        console.log(this.childrenContent);
    }
}

当我记录 childrenContent 时,我得到一个 QueryList 对象,但它是空的,没有可以从中获取信息的元素。

我尝试了几个@Directive 选择器,但我的QueryList 总是为空。

【问题讨论】:

  • 嘿伙计,你看到我的回答了吗?

标签: angular angular2-directives


【解决方案1】:

您可以使用 $event 属性来处理宽度、高度、偏移量等。通过使用这种方法,一个传统的 javascript 发挥作用,如下所示

HTML 代码将是

<div *ngFor="let link of links;" class="div-link" 
             height="100px"
             width="30px"
             (click)="changeActiveLink($event)">
          <h2>{{link}}</h2>
</div>
<div height="height" width="width" id="highlighter">some text</div>

将上面 div 元素中点击的元素处理为

changeActiveLink(value){
    this.height=value.srcElement.parentElement.attributes['height'].value;
    this.width=value.srcElement.parentElement.attributes['width'].value;
    console.log(this.width);
    console.log(this.height); 
  }

注意:在上面的例子中,点击事件在 letter 上,所以我们将 srcElement 作为h2,所以我使用的是 parentElement。您可以通过在方法中包含 if 条件的任何一种方式来实时处理它。

您还可以控制台记录被点击的元素并获得更多想法来实现这一点。

LIVE DEMO

【讨论】:

  • 这似乎不起作用,我可以通过事件,并且我能够得到value.srcElement,即&lt;h2&gt;link&lt;/h2&gt;,和value.srcElement.parentElement,这将是&lt;div&gt;&lt;/div&gt;,但我不能得到未定义的attributes['width'].value() 也失败。
  • 你需要点击的div元素的高度和宽度吗?
  • 正确,点击 div (click)=changeActiveLink() 应该得到点击的 div 的宽度和 offsetLeft,应该用于动画 highlighter div 的 widthoffsetLeft
  • 你在那个 plunker 中看到了 console.log() 吗?在此post 有参考。不过,如果您需要澄清一下,请告诉我,我会解释
  • 是的,它在 plunker 中工作,但是,您在链接上设置了固定宽度,我的没有,每个单词的长度不同,结果导致 div 具有不同的宽度。如果我将它们全部设置为固定宽度,我可以根据索引的倍数更改突出显示值。
【解决方案2】:

你可以在你想弄乱的元素上放置一个句柄..

<div #handle ..>

然后在您的组件类中,您可以使用@ViewChild 注解访问该组件。

然后在你的 ngOnViewInit 中你可以做 ..

ngOnViewInit() {
  viewChildEl.offsetLeft = 100;
}

应该为你指明正确的方向。

【讨论】:

  • 我已经在使用动画来管理 myhighlighter div 的外观,但我不知道如何获取 *ngFor 创建的 div 列表的宽度,@ViewChild 似乎对于单个元素。我需要更像getElementsByClass 的东西来获取元素数组。所以我可以使用activeLink 获取这个数组的子元素的宽度,activeLink 是当前活动的索引,0,1,2,3,....
  • 您可以使用ViewChildren(),但您需要将#handle 添加到您想要接收的每个元素中。 ViewChild(ren) 只能查询模板变量名称或组件/指令类型。您可以使用注入 ElementRef 的类选择器创建一个指令,以获取使用 ViewChildren 的类的所有元素。
猜你喜欢
  • 2021-03-14
  • 1970-01-01
  • 1970-01-01
  • 2021-03-27
  • 2014-07-01
  • 2013-05-04
  • 1970-01-01
  • 2019-12-29
  • 1970-01-01
相关资源
最近更新 更多