class Store {
private properties: any = {};
private emitter: EventEmitter;
public setValue(name: string, value: any): void {
this.properties[name] = value;
this.emitter.fire('did-change');
}
public getValue(name: string): any {
return this.properties[name];
}
public observe(name: string, callback: (newValue: any) => void): IDisposable {
callback(this.getValue(name));
return this.onDidChange(name, (event) => {
return callback(event.newValue);
});
}
public onDidChange(name: string, callback: (value: { oldValue: any, newValue: any }) => void): IDisposable {
let oldValue = this.getValue(name);
return this.emitter.addListener('did-change', () => {
let newValue = this.getValue(name);
if (!objects.equals(oldValue, newValue)) {
let event = {
oldValue: oldValue,
newValue: newValue
};
oldValue = newValue;
return callback(event);
}
});
}
}
用法:
let store = new Store();
let textArea = <HTMLTextAreaElement>document.querySelector('textarea');
textArea.onchange = () => {
store.setValue('text', textArea.value);
};
store.observe('text', value => {
textArea.value = value;
});
可以试试angularJs的双向绑定
写个方法检测某个类的变化, 然后在互相对应的元素上加上匹配的属性, 去更新另外一个类上对应的属性。 不知道有没有描述清楚。 框架的话angular啊,vue啊, 如果只有这个功能的话引入那种框架是没什么意思的。
自己写一个好了,方便,自由度高
个人更喜欢React那种单向绑定的思路,即数据改变视图,数据怎么变视图就怎么变,由于用户交互引起的视图变化改变的是数据。 我们要做的就是为每个视图绑定其关心的数据字段就行了。
贴一下单向数据绑定的伪代码:
实现:
用法: