【发布时间】:2016-03-27 12:48:32
【问题描述】:
我正在使用网络套接字将属性的更改 boardBucket 传输给其他客户端。
boardBucket是Object类型的共享属性,由观察者监视。当观察者收到更改通知时,更改会通过套接字发送到其他客户端,并应用到它们自己的
boardBucket。
现在的问题变成了如何防止某些对象更改(通过Array mutation methodsthis.set()、this.push() 等)重新触发发送更改的特定观察者。 p>
如果没有某种 silencing 功能,整个设置进入客户端之间的无限往返(一个客户端更改 boardBucket,另一个客户端应用更改,但也会触发它自己的 @ 987654329@观察者并不断重新发送它们。
是否可以在不以某种方式触发特定观察者的情况下更改属性(或其任何子项)的值?
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);
}
理想情况下,当改变对象/数组时可以传递一个标志,可以像这样在观察者中拾取:
// 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");
}
注意:
- 我也可以使用
<iron-signals>(即事件)而不是观察者,但我更愿意避免使用它们,因此提出了这个问题。 -
boardBucket是多个内部组件共享的属性,每个组件都会发生变异并观察到这一点。这就是我问在变异时是否只能跳过特定观察者的原因。 - 我可以在传入/传出更改之间进行一些相等性检查,如果
changes的路径/值相同,则忽略它而不发送它。但是我想有一种方法来防止其他一些突变到达套接字发送函数,因此这不起作用。这也有点老套。
【问题讨论】:
标签: javascript polymer polymer-1.0