Created
September 12, 2018 09:40
-
-
Save zcyemi/eb9604df3cbd29b24add4c0653f567bc to your computer and use it in GitHub Desktop.
Typescript Object property binding.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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