2016-03-14 23 views
20

Mam następującą dyrektywę (TextElementDirective), która ma 4 zmienne wejściowe colorHex, fontFamily, fontWeight, fontStyle. Chcę ustawić kolor i styl elementu za pomocą tej dyrektywy.Wartości wejściowe dyrektywy kątowej 2 są niezdefiniowane i niepoprawnie ustawione.

Kiedy używam tej dyrektywy w innym komponencie, jako atrybut, nie ustawia ona stylu i koloru elementu. Nawet jeśli klikniesz przycisk, wartości elementów nie zostaną ustawione.

Jeśli używam hosta (onmousemove) w dyrektywie, działa dobrze. Ale chcę ustawić wartości podczas uruchamiania.

Każdy pomysł, czego mi brakuje?

Oto komponent testowy, który z niego korzysta.

@Component({ 
template: 
` 
    <h3>Test</h3> 
    <div> 
     <span>text-element-map: </span> 
     <span class="text-content" text-element-map [colorHex]="colorHex" 
      [fontFamily]="fontFamily" [fontWeight]="fontWeight" [fontStyle]="fontStyle">Change this text</span> 

     <button (click)="setCurrentDesignElement()">Click</button> 
    </div> 
`, 
directives:[TextElementDirective], 
changeDetection: ChangeDetectionStrategy.Default 
}) 
export class TestComponent{ 

@ViewChild(TextElementDirective) 
private childTextElement: TextElementDirective; 


colorHex: string = "#e2e2e2"; 
fontFamily: string = "Arial"; 
fontWeight: string = "normal"; 
fontStyle: string = "normal"; 

setCurrentDesignElement(){ 
    this.color = { 
     hex: "#B4B4B4", 
     id: 5745, 
     name: "Athletic Heather" 
    }; 

    this.font = { 
     cssString: "Valera Round", 
     weight: "normal", 
     style: "italic" 
     }; 

    this.colorHex = "#B4B4B4"; 
    this.fontFamily = "Valera Round"; 
    this.fontWeight = "normal"; 
    this.fontStyle = "italic";  

    //this.childTextElement.setElement(); 
} 


} 

Odpowiedz

33

Input() s nie są dostępne w konstruktorze. Są one ustawiane przez wykrywanie zmian, a wykrywanie zmian jest uruchamiane po utworzeniu komponentu. Haki cyklu życia ngOnChanges (każdy update) i ngOnInit (raz po pierwszym ngOnChanges nazwać) są nazywane po wykryciu zmian zaktualizowano dane wejściowe:

Zmień

constructor(private el: ElementRef){ 
    this.setElement(); 
} 

do

constructor(private el: ElementRef); 

ngOnInit() { 
    this.setElement(); 
} 

ngOnInit() nazywa po zainicjowaniu wejść.


Zamiast

this.el.nativeElement.style.color = this.colorHex; 

lepiej wykorzystywać

@HostBinding('style.color') 
@Input() colorHex : string; 

@HostBinding('style.font-family') 
@Input() fontFamily : string; 

@HostBinding('style.font-weight') 
@Input() fontWeight : string; 

@HostBinding('style.font-style') 
@Input() fontStyle : string; 

Właściwie nie próbowałem się, aby dodać @HostBinding() i @Input() na tym samym polu, ale nie widzę dlaczego to nie zadziała.

+0

Działa, gdy inicjalizowana jest dyrektywa. Ale kiedy klikam przycisk, aby zresetować colorHex, fontFamily, itp., To nie resetuje tekstu. Jak upewnić się, że wywołanie setElement() podczas zmiany modelu? Dlaczego wykrywanie zmian nie przejmuje kontroli? –

+1

Istnieją dwa sposoby: make 'colorHex', ... setters i getters lub zmień' ngOnInit() 'na' ngOnChanges (changes) '. 'ngOnChanges' jest wywoływane za każdym razem, gdy zmienia się wartość wejściowa. Z powyższą sugestią nie powinieneś w ogóle potrzebować 'setElement()'. –

+0

Tak. Masz rację. Kiedy używam HostBinding, nie potrzebuję funkcji setElement. Wielkie dzięki. –

Powiązane problemy