我使用 ECMA7Object.observe
或 MozillaObject.watch
而不是eventEmitter
node 进行数据绑定。
对于Object.observe
,我找不到任何关于 android 浏览器兼容性的实现。他们基本上必须使用 setTimeout 轮询,所以我放弃了。
相反,Object.watch
可以在没有任何轮询的情况下使用 Chrome 库和本机 Firefox 等运行。
我找到的代码是
if (!Object.prototype.watch)
{
Object.defineProperty(Object.prototype, "watch",
{
enumerable: false,
configurable: true,
writable: false,
value: function(prop, handler)
{
var
oldval = this[prop],
newval = oldval,
getter = function()
{
return newval;
},
setter = function(val)
{
oldval = newval;
return newval = handler.call(this, prop, oldval, val);
};
if (delete this[prop])
{ // can't watch constants
Object.defineProperty(this, prop,
{
get: getter,
set: setter,
enumerable: true,
configurable: true
});
}
}
});
}
// object.unwatch
if (!Object.prototype.unwatch)
{
Object.defineProperty(Object.prototype, "unwatch",
{
enumerable: false,
configurable: true,
writable: false,
value: function(prop)
{
var val = this[prop];
delete this[prop]; // remove accessors
this[prop] = val;
}
});
}
这适用于
obj.watch('foo',
function(id, oldval, newval)
{
//..........
return newval;
});
但是,出现了一个大问题,就是当我在各个地方实现多个watch时,只有第一个obj.watch被触发,其余的都不会触发。
原因很明显。
在第一次触发时,其余的 obj.watch 会自动设置为监视更改的值。
测试代码:
var obj = {
foo: 5
};
obj.watch('foo',
function(id, oldval, newval)
{
alert(newval);
return newval;
});
obj.watch('foo',
function(id, oldval, newval)
{
alert(newval);
return newval;
});
obj.foo = 7;
结果:没有错误,但只发出一次警报。
实际上,我试图找到允许为同一对象实例/属性触发多个监视块的替代库/机制。
同样,我将避免使用 eventEmitter 模式,而是避免使用观察者模式。你有什么主意吗?谢谢。