angular - Hämta värde från direktiv för framtida användning
Jag försöker få en verktygsfält fast längst ner i fönstret, men en annan komponent hamnar alltid ovanpå den när jag skrollar ner. Lösningen jag kom på var att ta höjden på verktygsfältet och ge den "andra komponenten" DET värdet i margin/padding nedtill. Så den kommer aldrig att hamna ovanpå det.
get-height-directive.ts
import { Directive, ElementRef, OnInit } from '@angular/core';
import { EventEmitter } from '../../../../node_modules/protractor';
@Directive({
selector: '[appGetHeight]'
})
export class GetHeightDirective implements OnInit{
constructor(public el: ElementRef) {}
ngOnInit() {
let styles = getComputedStyle(this.el.nativeElement);
console.log(styles.height);
}
}
Jag tillämpade den direktiven på detta:
var-man-ska-ansöka-direktiv.html
<div appGetHeight class="col">
<p >Lorem ipsum dolor sit amet consectetur adipisicing elit. Architecto ipsum repellat illum corporis, possimus consequatur qui nisi ipsa in. Molestiae, dolor. Fugit, eum quas. Provident neque id optio facilis velit.</p>
</div>
Med detta får jag höjden på verktygsfältet i en console.log som säger något som 66.8px. Jag vill använda det där '100px' nu för att styla margin-bottom på ett element i en syskonkomponent, men jag kunde inte hitta någon lösning.
Tack för hjälpen.
Svar #1
För att få tillgång till instansen av en direktiv, överväg att använda exportAs-variabeln. Du kan läsa mer här:
https://netbasal.com/angular-2-take-advantage-of-the-exportas-property-81374ce24d26
Sammanfattning: Med export får du möjligheten att få åtkomst till en komponents direktiv. För att få sådan åtkomst behöver du lägga till exportAs i @Directive-dekoratorn och ge det ett namn.
För att spara direktivet till en variabel i förälderns vy kan du använda följande syntax:
Här är ett exempel med din kod:
@Directive({
selector: '[appGetHeight]',
exportAs: 'heightDirective'
})
export class GetHeightDirectiveDirective implements OnInit {
public styles: CSSStyleDeclaration;
constructor(public el: ElementRef) {
}
ngOnInit() {
this.styles = getComputedStyle(this.el.nativeElement);
console.log(this.styles.height);
}
}
Notera:
Jag ändrade styles till this.styles annars kommer variabeln att tas bort efter ngOnInit eftersom let är en block-skopad variabel.
Ta en titt på "exportAs" på den tredje raden.
Användning :
<div appGetHeight #varWithDirective="heightDirective">Test</div>
<div class="login-background" [style.margin-bottom]="varWithDirective.styles.height" >
Observera här #varWithDirective="heightDirective" höjdDirektiven måste representera exportAs-namnet. Då har jag tillgång till alla värden från direktiven inom variabeln #varWithDirective.
Jag hoppas att detta hjälper dig.
Viktigt: Det du frågar efter kan definitivt lösas med en annan metod. Det är dålig praxis att lösa CSS-problem med JavaScript. Men för det skulle jag behöva mer information.
Överväg att använda: z-index/position fixed och kanske css-grid.
Svar #2
Enkel
@Outputoch andra kan prenumerera på förändringen.Skapa en tjänst, som
AppHeightService. Skapa enSubject-komponentvariabel i den som kommer att sända den beräknade höjden till alla som prenumererar på den. För att meddela tjänsten från direktivet, skapa helt enkelt en funktion i tjänsten som:emitHeight(height: string). I denna funktion kan du anropa next på subject med detta värde.
