0

ノードの代わりにECMA7Object.observeまたはMozillaを使用してデータバインディングを行います。Object.watcheventEmitter

についてObject.observeは、Android ブラウザの互換性に関する実装が見つかりません。基本的にはsetTimeoutポーリングを使わなければならないので諦めました。

代わりに、Object.watchChrome のライブラリやネイティブの 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 パターンは避けます。何か考えはありますか?ありがとう。

4

3 に答える 3

0

ここにあなたが探しているものに非常に近い小さなライブラリがあります

https://github.com/imolus/js-object-watch

于 2016-07-05T21:51:13.260 に答える