2016-10-02 45 views
7

Elemanların genişliği/yüksekliği direktifler ve bileşenler dahilinde nasıl edinilir?

@Component({ 
 
    selector: '.donation', 
 
    template: ` 
 
    <figure id="donation" move> 
 
     <img src="image/qrcode.png"/> 
 
     <figcaption> 
 
     Buy me a cup of coffee. 
 
     </figcaption> 
 
    </figure> 
 
    ` 
 
}) 
 
export class DonationComponent{} 
 

 
@Directive({ 
 
    selector: '[move]' 
 
}) 
 
export class MoveDirective{}

Hey, bu bana yardım edin biliyorum bu answer.Do biri için bir yol bulamıyorum hala MoveDirective ve DonationComponent içinde öğenin genişlik/yükseklik, ben belge birkaç kez okumak almak istiyorum ama ,çok teşekkürler! aşağıda gösterildiği gibi

cevap

18

Sen ElementRef kullanabilirsiniz

DEMO: https://plnkr.co/edit/XZwXEh9PZEEVJpe0BlYq?p=preview onay tarayıcının konsol. İhtiyacınız her yerde bileşen kendi içinde kullanabilirsiniz

import { Directive,Input,Outpu,ElementRef,Renderer} from '@angular/core'; 

@Directive({ 
    selector:"[move]", 
    host:{ 
    '(click)':"show()" 
    } 
}) 

export class GetEleDirective{ 

    constructor(private el:ElementRef){ 

    } 
    show(){ 
    console.log(this.el.nativeElement); 

    console.log('height---' + this.el.nativeElement.offsetHeight); //<<<===here 
    console.log('width---' + this.el.nativeElement.offsetWidth); //<<<===here 
    } 
} 

aynı şekilde. micronyks ile daha

biraz için
+1

Çok teşekkürler, Mükemmel çalışıyor! Ama yine de, ofsetHeight'ın neden kullanıldığını, ancak öğenin yüksekliğini elde etmek için yükseklik özelliğini kullanma konusunda biraz kafam karışmış durumdayım. –

+0

'ElementRef' güvenlik riski olarak işaretlendi: https://angular.io/docs/js/latest/api/core/index/ElementRef-class.html - hala kullanmak yolunda mı? – shiva

+0

@ svava riskli degil, tehlikeli bilgi eklemeksizin DOM'den bilgi ayiracaksiniz. – bersling

6

fazla esneklik böyle yapabilirsin, cevap:

Şablonunuzda

1., içinden genişliğini elde etmek istediğiniz öğeye #myIdentifier ekleyin. Örnek: güvenlik riskine ilişkin olarak

import {AfterViewInit, Component, ElementRef, OnInit, ViewChild} from '@angular/core'; 

@Component({ 
    selector: 'app-my-component', 
    templateUrl: './my-component.component.html', 
    styleUrls: ['./my-component.component.scss'] 
}) 
export class MyComponentComponent implements AfterViewInit { 

    constructor() { } 

    ngAfterViewInit() { 
    console.log(this.myIdentifier.nativeElement.offsetWidth); 
    } 

    @ViewChild('myIdentifier') 
    myIdentifier: ElementRef; 

} 

Güvenlik

: Kumandanızda olarak

<p #myIdentifier> 
    my-component works! 
</p> 

2., genişliğini almak için @ViewChild('myIdentifier') ile kullanabilirsiniz ElementRef, bunun gibi, hiçbiri yoktur. Bir ElementRef kullanarak DOM değerini değiştirirseniz bir risk olur. Ama burada sadece alınıyorsunuz DOM Öğeleri böylece risk yok. ElementRef kullanmanın riskli bir örneği: this.myIdentifier.nativeElement.onclick = someFunctionDefinedBySomeUser;. Bu Eğik almaz gibi someFunctionDefinedBySomeUser beri sanitisation mekanizmalarını kullanmak için bir şans Eğik sanitisation atlayarak, DOM doğrudaneklenir.

+0

Bu işlem olayları yeniden boyutlandırmayı nasıl işler? –

+1

Değil, ancak bir @HostListener penceresi ekleyebilirsiniz: yeniden boyutlandırma, bkz. Ör. https: // viski.io/öğreticiler/tepkili-eşit yükseklikte-ile-açısal-direktifi # toc-dur--biz-yapılır-henüz – bersling