Skip to content

Instantly share code, notes, and snippets.

@zcyemi
Created September 12, 2018 09:40
Show Gist options
  • Save zcyemi/eb9604df3cbd29b24add4c0653f567bc to your computer and use it in GitHub Desktop.
Save zcyemi/eb9604df3cbd29b24add4c0653f567bc to your computer and use it in GitHub Desktop.
Typescript Object property binding.
function BindFunc(tar:object,property:string,f:(v:any)=>void){
var property_emit = BIND_EMITTER(property);
if(tar.hasOwnProperty(property_emit)){
tar[property_emit].push(f);
}
else{
BindSetup(tar,property);
tar[property_emit].push(f);
}
}
function BindTwoWay(property:string,tar1:object,tar2:object){
BindFunc(tar1,property,(v)=>tar2[property] =v);
BindFunc(tar2,property,(v)=>tar1[property] =v);
}
function BIND_EMITTER(p:string){
return '_bind_' + p;
}
function BindSetup(tar: object, property: string) {
var property_emit = BIND_EMITTER(property);
if(tar[property_emit] != null) return;
tar[property_emit] = [];
var emitter = tar[property_emit];
var descriptor = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(tar), property);
if (descriptor != null && descriptor.set != null && descriptor.get != null) {
var getter = descriptor.get;
var setter = descriptor.set;
Object.defineProperty(tar, property, {
get: function () {
return getter.call(this);
},
set: function (v: any) {
let curv = getter.call(this);
if(curv != v){
setter.call(this, v);
emitter.forEach(f => f(v));
}
}
})
}
else {
var val = tar[property];
var property_bind = '_bind_' + property+'_p';
tar[property_bind] = val;
Object.defineProperty(tar, property, {
get: function () {
return this[property_bind];
},
set: function (v: any) {
let curv = this[property_bind];
if(curv != v){
this[property_bind] = v;
emitter.forEach(f => f(v));
}
}
})
}
}
class ClassA{
public p:number = 10;
}
class ClassB{
private m_p:number =10;
public get p():number{
return this.m_p;
}
public set p(v:number){
this.m_p = v;
}
}
var a = new ClassA();
var b = new ClassB();
BindFunc(a,'p',(v)=>{
console.log('a:'+v);
});
BindFunc(b,'p',(v)=>{
console.log('b:'+v);
});
a.p = 11;
b.p = 17;
BindTwoWay('p',a,b);
a.p = 15;
console.log('>b:'+b.p);
b.p = 25;
console.log('>a:'+a.p);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment