2016-12-13 5 views
3

В некоторых местах я обнаружил, что гнездовал слушателей базы данных Firebase. Например, у меня есть список foos, каждый со списком bars, и я хочу сделать что-то, когда новый bar добавляется к любому foo:Очистить обработчик событий Firebase внутри `child_added`?

firebase.database().ref('foos').on('child_added', function(fooSnap) { 
    fooSnap.ref.child('bars').on('child_added', function(barSnap) { 
     // do something with the new bar 
    }); 
}); 

Есть ли лучший способ сделать это?

А если foo удаляется, что вложенная barchild_added слушателем очищены, или я должен называть .off(...) в child_removed слушателя где-нибудь? Как я могу это сделать?

+0

Не содержит ли 'fooSnap.val()' всех дочерних элементов/дочерних элементов нового узла? т. е. можно ли использовать синхронный цикл внутри? – qxz

+0

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

ответ

0

Как правило, в базе данных NoSQL неплохо иметь более плоский дизайн. Например, в настоящее время у вас есть структура, как -

{ 
    "foos": { 
     "F1": { 
      "foo_data": "", 
      "bars": { 
       "B1": { 
        "bar_data": "" 
       }, 
       "B2": { 
        "bar_data": "" 
       } 
      } 
     }, 
     "F2": { 
      "foo_data": "", 
      "bars": { 
       "B1": { 
        "bar_data": "" 
       }, 
       "B2": { 
        "bar_data": "" 
       } 
      } 
     } 
    } 
} 

Но вы можете сгладить его, как следующее -

{ 
    "foos": { 
     "F1": { 
      "foo_data": "", 
      "bars": ["B1", "B2"] 
     }, 
     "F2": { 
      "foo_data": "", 
      "bars": ["B3", "B4"] 
     } 
    }, 
    "bars": { 
     "B1": { 
      "bar_data": "" 
     }, 
     "B2": { 
      "bar_data": "" 
     }, 
     "B3": { 
      "bar_data": "" 
     }, 
     "B4": { 
      "bar_data": "" 
     } 
    } 
} 

Таким образом, вам не нужно гнездиться обработчики событий.

Смежные вопросы