ノードの代わりにECMA7Object.observe
またはMozillaを使用してデータバインディングを行います。Object.watch
eventEmitter
について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;
});
ただし、大きな問題が発生します。さまざまな場所に複数のウォッチを実装すると、最初の 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;
結果: エラーは発生しませんでしたが、アラートは 1 回だけ発生しました。
実際、同じオブジェクト インスタンス/プロパティに対して複数の監視ブロックをトリガーできる代替ライブラリ/メカニズムを見つけようとしています。
ここでも、eventEmitter パターンは避けますが、observer パターンは避けます。何か考えはありますか?ありがとう。