调用set()
的Firebase客户端将导致所有已连接的客户端value
触发 - 包括 - 发出set()
的原始客户端。
在我的情况下(我认为在大多数情况下),发出set()
的客户端没有理由响应其自己的调用产生的值事件。显然它的模型是正确的,没有必要改变它(这可能是一个昂贵的操作)。
客户端是否有办法不接收/阻止/忽略由其value
呼叫触发的set()
事件?我考虑在set()
左右使用off / on,但这可能会导致客户端错过value
同时发生但未被其触发的事件。
我错过了一些明显的东西吗?
答案 0 :(得分:5)
大多数应用程序将Firebase数据本身视为其模型。因此,当有更新时,他们会调用ref.set()
(或另一个mutator函数),然后更新会通过on()
事件返回到他们的应用中。 React / Flux爱好者将此视为unidirectional data-flow,其他人可能将其视为Command Query Responsibility Segregation。
但确实存在模型已更新的情况,因此如果您是触发它的人,您希望忽略Firebase中的事件。
没有用于不接收这些自触发事件的API。相反,你必须记住"您发送到Firebase并在on()
处理程序中过滤掉的数据。
来自Firebase keeps a list of segments that it sends to Firebase然后ignores those segments in its onChildAdded
handler的Android绘图示例。它使用push id来识别线段,并使用它们生成客户端,因此可以使用它们来跟踪识别段。
这样的JavaScript示例:
var pendingChildIds = []; // Push ids of nodes we've sent to the server, but haven't received in `on()` yet
// this code is in your UI event handler, or whatever triggers the needs to update your Firebase data
var newChild = ref.push();
pendingChildIds.push(newChild.key());
newChild.set(
{ property1: 'value1', property2: 3.14 },
function(error) {
// the write operation has completed, remove the child id from the list of pending writes
pendingChildIds.splice(pendingChildIds.indexOf(newChild.key());
}
);
// this is the event handler, using child_added in this case
ref.on('child_added', function(snapshot) {
if (!pendingChildIds.contains(snapshot.key())) {
// this is a child that we DIDN'T generate
}
});
答案 1 :(得分:1)
我最终在模型中添加了一个客户端ID,如:
var clientId=(Math.random()*10000000000000000).toFixed(0);
function set(data) {
ref.set(JSON.stringify({ clientId: clientId, data: data }));
}
ref.on('value', function(snapshot) {
var json=JSON.parse(snapshot.val());
if (!json || json.clientId===clientId) return;
var data=json.data;
// update model with data
});