2015-02-01 1 views
5

Предположим, что у меня есть одна операция. Как удаляет.Использовать off() непосредственно в on() callback Firebase?

var q = ref.child('users').child(targetUserId).child('chat'); 
q.on('child_added', function(obj) { 
    obj.ref().remove(); 

    //This works right? 
    q.off(); 
}); 

Могу ли я выполнить off() непосредственно в on() обратного вызова? Мне не нужно указывать eventType правильно?

Ничего другого, чтобы очистить право?

From the docs:
Аналогично, если нет типСобытия или обратного вызова не указано, все обратные вызовы для ссылки будут удалены.

+4

Если вы снова включите и снова включите его, вы можете вместо этого использовать 'once'. –

+0

@FrankvanPuffelen Я пытался использовать 'once()' в немного другой версии приведенного выше примера - 'q.endAt (оцененныйServerTimeMs-5000) .once (...)' - но 'remove()' будет только удалите одну запись (первая в соответствующем наборе). Изменение 'once' на' on' будет удалять все соответствующие записи. Любая идея, почему это может быть? –

+2

При использовании 'once' Firebase будет запускать только одно событие. Поэтому в случае 'child_added' он будет запускаться только для одного ребенка (независимо от того, сколько детей соответствует запросу). Для вашего первоначального вопроса это именно то, что вам нужно. Но для примера использования в вашем комментарии придерживайтесь 'on ('child_added'' и' off' в правильном состоянии или, альтернативно, 'once (' value '', а затем' forEach' над дочерними элементами в снимке. –

ответ

4

Могу ли я выполнить off() непосредственно в on() обратного вызова?

Да.

Мне не нужно указывать тип события правильно?

Исправить. Как указано в docs, если eventType опущен, все обратные вызовы для ссылки будут удалены.

Вы также можете просто ЦЕПЬ .off() метода, как это, а не вызывать его внутри обратного вызова:

var q = ref.child('users').child(targetUserId).child('chat'); 
q.on('child_added', function(obj) { 
    obj.ref().remove(); 
}).off(); 

Как Frank van Puffelen suggests в комментариях, вы можете также использовать .once() method для того, чтобы обратный вызов только один раз:

var q = ref.child('users').child(targetUserId).child('chat'); 
q.once('child_added', function(obj) { 
    obj.ref().remove(); 
}); 

Преимущество такого подхода заключается в том, перемещение других прикрепленных событий.

+5

Я не уверен, что вы можете связать их. [.on() возвращает функцию обратного вызова, а не 'this' context ref] (https://www.firebase.com/docs/web/api/query/on .html) – Kato