2017-03-12 11 views
0

私はAngularJSの$watch関数(hereと定義されている)と同様の機能を見つけようとしています。これは複雑なオブジェクトの監視とその変更を可能にします。私が知っている限りでは、オブジェクト内の変数(ウォッチ対象オブジェクト内)にも変数が含まれていても、オブジェクト内の変数の変化を見ることができると理解しています。JavaScriptで複雑なオブジェクトとそれらの変更を監視するには?

ネイティブJavaScript(またはJQuery)ではこれと同じ 'watchability'を使いたいと思っていますが、何も見つかりません。私はObject.watch()Polyfillと知っていますが、hereがありますが、これは参照チェックのみを行うか、オブジェクト内の「即時」変数だけを監視し、話すためにネストされたものではなく、プロパティを「深い」内部でチェックしませんオブジェクト。

この「ディープウォッチング」機能を提供するのに役立つライブラリ、機能、その他のことを知っている人はいますか?あるいは、実際に私が望んでいるものを提供している場合、Object.watch()をもっとよく理解するのに役立つでしょうか?

私はリアルタイムの音楽アプリケーションを作成していて、楽器を「深く」見ていたいので、変数やパラメータなどが変更されているかどうかを確認できます。他のクライアント。

ご協力いただきありがとうございます、ありがとうございます!

答えて

4

を楽しむ観光

function proxify(object, change) { 
    var proxy = new Proxy(object, { 
     set: function(object, name, value) { 
      var old = object[name]; 
      if (value && typeof value == 'object') { 
       // new object need to be proxified as well 
       value = proxify(value, change); 
      } 
      object[name] = value; 
      change(object, name, old, value); 
     } 
    }); 
    for (var prop in object) { 
     if (object.hasOwnProperty(prop) && object[prop] && 
      typeof object[prop] == 'object') { 
      // proxify all child objects 
      object[prop] = proxify(object[prop], change); 
     } 
    } 
    return proxy; 
} 

とあなたを次のようにこの機能を使用できます:

object = proxify(object, function(object, property, oldValue, newValue) { 
    console.log('property ' + property + ' changed from ' + oldValue + 
       ' to ' + newValue); 
}); 

...

+0

プロキシ機能の例を教えていただきありがとうございます。私の問題にどのように適用されたのか混乱しています。あなたが与えた関数は文字通り私のオブジェクトに対するすべての変更を示しています。これは素晴らしいことです!私はあなたのコードを使用しているので、私はあなたの答えとしてマークすることを考えていたが、あなたはそれが他のコメントの延長であると言いました。答え? –

+0

@AlistairHughes確かではありませんが、実際のコードがあるため、同じ問題を抱える他の人には役に立ちます。 – jcubic

2

あなたはObject.watch

警告を使用しないでください:一般的に、あなたが時計()とunwatch()可能性を使用しないでください。これらの2つのメソッドはGeckoでのみ実装されており、主にデバッグ用です。さらに、ウォッチポイントの使用はパフォーマンスに重大な悪影響を及ぼします。これは、ウィンドウなどのグローバルオブジェクトで使用する場合に特に当てはまります。通常、代わりにセッターとゲッターまたはプロキシを使用できます。詳細については、ブラウザの互換性を参照してください。また、Object.watchとObject.observeを混同しないでください。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/watch

私はむしろプロキシを見ていると思います:

プロキシオブジェクトは、基本的な操作のためのカスタム動作を定義するために使用されている(例えば、プロパティ検索、割り当て、列挙、関数呼び出しを、など)。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy

そしておそらくMutationObserver暗示でDOM場合:

MutationObserverは、DOMの変化に反応する方法を開発者に提供します。これは、DOM3イベント仕様で定義されている突然変異イベントの代わりに設計されています。

https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver

&あなたは変化を観察するためにプロキシオブジェクトを使用することができます言及Booster2ooo @として、あなたはこのようなものを使用することができます:)

関連する問題