私はウェブソケットを使用して、他のクライアントにboardBucket
というプロパティの変更を送信しています。特定のオブザーバをトリガーしない配列の変異
boardBucket
観察者が見タイプObject
の共有財産です。変更がオブザーバに通知されると、変更はソケットを介して他のクライアントに送信され、そこで自分自身の
boardBucket
に適用されます。
問題は今変更を送信し、その特定のオブザーバを再トリガから(Array mutation methodsthis.set()
、this.push()
などを介して)いくつかのオブジェクトの変更を防止する方法になります。機能をサイレンシングの一部現物なし
、全体のセットアップは1つのクライアントがboardBucket
を変更する(クライアント間で無限の往復になり、他のクライアントは、変更が適用されますが、それはまた、それ自身のboardBucket
オブザーバをトリガし、背中にそれらを再送しますと)。
それは、プロパティの値(またはその任意のサブ項目をだ)何らかの方法で特定のオブザーバーをトリガなしに変更することは可能ですか?
// flag can be read in observer
_boardBucketChanged: function(changes, flag) {
if(flag === "preventNotify") return false;
sockets.send(changes);
},
// `flag` parameter can be passed with each mutation
_boardBucketReceived: function(changes) {
if(flag === "preventNotify")
return false;
this.set("boardBucket", changes, "preventNotify");
}
注:
- 私ができるようように観察者に撮像することができるオブジェクト/配列を変異させる場合
properties: { boardBucket: { type: Object, value: null, notify: true } }, observers: [ "_boardBucketChanged(boardBucket.*)" ], // if my `boardBucket` changes send changes to other clients _boardBucketChanged: function(changes) { sockets.send(changes); }, // get changes sent by other clients and apply them _boardBucketReceived: function(changes) { // How can I silently make the following changes // so it doesn't trigger **only** the above observer? this.set("boardBucket", changes); }
理想的には、フラグを渡すことができまた、オブザーバーの代わりに
<iron-signals>
(すなわちイベント)を使用してくださいが、私はそれらを避ける方がよいでしょう。 boardBucket
は、複数の内部コンポーネントによって共有されるプロパティで、各コンポーネントはこれを変更して監視します。これは、の特定のオブザーバだけが突然変異するときにスキップできるかどうかを尋ねる理由です。- 受信/送信の変更の間にいくつかの等価性チェックを行い、パス/値が
changes
の場合、それを無視して送信しないことができます。しかし、私はいくつかの他の突然変異がsocket-send関数に到達するのを防ぐ方法を持っていますので、これはうまくいきません。それはまた、ちょっとしたハッキーです。
ニース:)実際には、これは*インタロック*になっています。しかし、設定が完了している間に*新しい*変更が来たらどうなるでしょうか?実際の問題は、あなたがすでに指摘した問題ですが、このメカニズムは 'this.set()'に応答してどのような変更も禁止しますので、少し柔軟性がありません。 –
_boardBucketReceivedが何とか再帰的に(this.setに応答して)呼び出すことができない限り、設定が行われている間に新しい変更が発生することは間違いないと思います。 WebSocketからの単なるコールバックだと仮定すると、一度に1回だけ呼び出されるべきです。 – trepidacious