當你調用off()
它將從燒製附帶在新的數據child_added
事件停止火力地堡的客戶端。這並不妨礙它從發射數據已經收到客戶child_added
事件。
您可以通過這種方式獲得一些有趣的行爲。例如,您的片段:
var ref = new Firebase('https://stackoverflow.firebaseio.com/31069762');
ref.remove();
for (var n = 0; n < 1024; ++n) {
ref.push(n)
}
ref.on('child_added', function(snapshot) {
console.log(snapshot.val());
if (snapshot.val() > 10) {
console.log('off') // Printed multiple times.
ref.off();
}
});
會打印:
1
2
.
.
.
11
"off"
12
"off"
.
.
.
1024
"off"
您參考的數據下載,當您註冊的所有child_added
事件監聽器,並從那裏「一個初始分組」被解僱。
現在,讓我們改變周圍的代碼:
var ref = new Firebase('https://stackoverflow.firebaseio.com/31069762');
ref.remove();
ref.on('child_added', function(snapshot) {
console.log(snapshot.val());
if (snapshot.val() > 10) {
console.log('off') // Printed multiple times.
ref.off();
}
});
for (var n = 0; n < 1024; ++n) {
ref.push(n)
}
在這種情況下
所以我們第一註冊監聽器,然後纔開始推值。輸出:
1
2
.
.
.
11
"off"
因此,這個命令立即停止。由於我們在有任何數據之前開始監聽child_added
,因此初始有效內容爲空,然後我們將每個孩子作爲單獨更新。
請注意,這一切都取決於Firebase客戶端的內部,我沒有檢查它在那裏的實際工作方式。所以我上面提到的「一個初始數據包」就是如何將其可視化。
如果你真的不想在10
之後處理數據,我可以考慮兩種解決方案。
一個你已經做:保持本地「我做」標誌
使用Query
來限制數據火力地堡下載,而不是過濾客戶端:
ref.orderByValue().endAt(10).on('child_added'...
請注意,orderByValue
是在Firebase JavaScript SDK 2.2.7版中引入的。我花了一段時間才弄清楚爲什麼我不能在JSBin中使用它。 : -/
'ss'是一個'Event',那麼什麼是'ss.val()。end'應該是什麼? – Barmar
@Barmar:這只是一個價值。這與問題有什麼關係? – ronag
'Event'沒有'val()'方法,因此它在嘗試調用'ss.val()'時應該會出錯。這將阻止'segmentsRef.off()'完成。 – Barmar