I have a template which has textbox, one 'span' tag and one 'div' tag.
'div' tag has 'selectedColor' custom directive. I want to change background color of 'span' and 'div' tags when input value is changed.
So finally I want my directive to react on input change and sets background color of 'div' tag.
I also want to change 'span' background color on input value change event.
Plunker
boot.ts
import {Component,bind} from 'angular2/core';
import {bootstrap} from 'angular2/platform/browser';
import {FORM_DIRECTIVES} from 'angular2/form';
import {selectedColorDirective} from 'src/directive';
import {Directive, ElementRef, Renderer, Input} from 'angular2/core';
@Component({
selector: 'my-app',
template: `
<input type="text" [(ngModel)]="color" />
<br>
<span > I'm {{color}} color <span>
<div [mySelectedColor]="color"> I'm {{color}} color </div>
`,
directives: [selectedColorDirective]
})
export class AppComponent{
color:string;
constructor(el:ElementRef,renderer:Renderer)
{
this.color="Yellow";
renderer.setElementStyle(el, 'backgroundColor', this.color);
}
}
bootstrap(AppComponent, []);
directive.ts
import {Directive, ElementRef, Renderer, Input} from 'angular2/core';
@Directive({
selector:"[mySelectedColor]",
host: {
// '(keyup)': 'changeColor()',
'(blur)': 'changeColor()',
}
})
export class selectedColorDirective{
@Input('mySelectedColor') selectedColor: string;
constructor(el: ElementRef, renderer: Renderer) {
//el.nativeElement.style.backgroundColor = 'yellow';
renderer.setElementStyle(el, 'backgroundColor', this.selectedColor);
}
changeColor(color:string)
{
console.log('Changed Detection' + " " + selectedColor);
//this.renderer.setElementStyle(this.el, 'backgroundColor', this.color);
}
}
Moreover if you could explain more about @Input decorator.
You can create an @Input() someName: SomeType
in your directive and bind it to a field or function in the parent component like
<div [mySelectedColor]="color"
[someName]="someFieldInParent"> I'm {{color}} color </div>
Another way is to query the directive in the parent component and invoke functions or set fields directly.
export class AppComponent{
@ViewChild(selectedColorDirective) myDirective: selectedColorDirective;
ngAfterViewInit() {
myDirective.changeColor('red');
}
}
You can also bind directly to class
and assign CSS by using these class selectors.
See for example this http://plnkr.co/edit/nm8RgxMtqdEDyQWQGeUp?p=preview
Using a binding as selector at the same time is not supported currently, therefore you have to list the directive selector and the property you bind to each. Only [(myDirective)]="someField"
seems to be supported.
I used
host: {
'(keyup)': 'changeColor()',
'[style.color]': 'selectedColor', // <==
}
for setting the style (I also changed the AppComponent
to use this way). This is preferred to using ElementRef
and Renderer
. I used ElementRef
and Renderer
for the <span>
tag though because I don't see another way from the directive on another element.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With