What is the best practice for routing input/output properties of a subcomponent including the event logic in angular 2?
The following solution is the only way I found so far.
@Component({selector: "clock",
template: `
<timer [(seconds)]="seconds" [(minutes)]="minutes"></timer>
`
})
export class Clock{_seconds:number = 0;
@Input("seconds")
set seconds(v:number) {
this._seconds = v;
this.secondsChange.emit(v);
}
get seconds() {
return this._seconds ;
}
@Output("secondsChange") secondsChange:EventEmitter<number> = new EventEmitter();_minutes:number = 0;
@Input("minutes")
set minutes(v:number) {
this._minutes= v;
this.minutesChange.emit(v);
}
get minutes() {
return this._minutes;
}
@Output("minutesChange") minutesChange:EventEmitter<number> = new EventEmitter();}
Is there a shorter or recommended way?
Best
Jan
@Component({
selector: "clock",
template: `
<timer [(seconds)]="seconds" [(minutes)]="minutes"></timer>
`
})
export class Clock{
@InAndOut
public seconds:number;
@Output("secondsChange") secondsChange:EventEmitter<number> = new EventEmitter();
@InAndOut
public minutes:number;
@Output("minutesChange") minutesChange:EventEmitter<number> = new EventEmitter();
}
import {EventEmitter} from "angular2/core";
export function InAndOut(target:any, name:any) {
// property value
var _val = this[name];
// property getter
var getter = function () {
return _val;
};
// property setter
var setter = function (newVal:any) {
_val = newVal;
// emit
if( this[name + "Change"] ) {
this[name + "Change"].emit(newVal);
}
};
// Delete property.
if (delete this[name]) {
// Create new property with getter and setter
Object.defineProperty(target, name, {
get: getter,
set: setter,
enumerable: true,
configurable: true
});
}
}
@InAndOut public seconds:number = 0;
@Output("secondsChange") secondsChange = new EventEmitter();
@InAndOut public seconds:number = 0;
Is there a chance to include the creation of secondsChange with the @Output decorator from inside the @InAndOut decorator.So I could reduce the lines:@InAndOut public seconds:number = 0;
@Output("secondsChange") secondsChange = new EventEmitter();
to:@InAndOut public seconds:number = 0;
"use strict";
import {EventEmitter} from "angular2/core";
import {Output} from "angular2/core";
export function InAndOut(target:any, name:any) {
///// CREATE GETTER UND SETTER FOR PROPERTY
var descriptor:PropertyDescriptor = Object.getOwnPropertyDescriptor(target, name);
if (descriptor) {
// f.i. handle an previous decorator for the property
Object.defineProperty(target, name, {
get: function ():any {
return descriptor.get.call(this);
},
set: function (newValue:any) {
descriptor.set.call(this, newValue);
// emit
this[name + "Change"].emit(newValue);
},
enumerable: true,
configurable: true
});
} else {
// store property
var _val:any;
// Create new property
Object.defineProperty(target, name, {
get: function ():any {
return _val;
},
set: function (newValue:any) {
_val = newValue;
// emit
this[name + "Change"].emit(newValue);
},
enumerable: true,
configurable: true
});
}
///// CREATE EMITTER FOR PROPERTY
// emitter
var _emitter = new EventEmitter();
// Create new emitter property
Object.defineProperty(target, name + "Change", {
get: function () {
return _emitter;
},
set: function (newVal:any) {
_emitter = newVal;
},
enumerable: true,
configurable: true
});
// create @Output decorator for the emitter
Reflect["decorate"]([
Output()
], target, name + "Change");
}
@InAndOut seconds:number = 0;
@logProperty
@InAndOut
test:number = 111;
output(target, name+'Change')
Output(target, name);
// create @Output decorator for the emitter
Reflect["decorate"]([
Output()
], target, name + "Change");
"use strict";
import {EventEmitter} from "angular2/core";
import {Output,Input} from "angular2/core";
export function InAndOut(target:any, name:any) {
///// CREATE EMITTER FOR PROPERTY /////
// emitter
var _emitter = new EventEmitter();
// Create new emitter property
Object.defineProperty(target, name + "Change", {
value: _emitter,
enumerable: true,
configurable: true
});
// create @Output decorator for the emitter
Output()(target, name + "Change");
///// CREATE GETTER UND SETTER FOR PROPERTY /////
var descriptor:PropertyDescriptor = Object.getOwnPropertyDescriptor(target, name);
if (descriptor) {
// handle an previous descriptor (getter and setter)
Object.defineProperty(target, name, {
get: function ():any {
return descriptor.get.call(this);
},
set: function (newValue:any) {
descriptor.set.call(this, newValue);
// emit
this[name + "Change"].emit(descriptor.get.call(this));
},
enumerable: true,
configurable: true
});
} else {
// first descriptor
// store property value
var _val:any;
// Create new property
Object.defineProperty(target, name, {
get: function ():any {
return _val;
},
set: function (newValue:any) {
_val = newValue;
// emit
_emitter.emit(newValue);
},
enumerable: true,
configurable: true
});
}
// create @Input decorator
Input()(target, name);
}