2014-09-03 7 views
6

Say mam następujące:Firebase uzyskać pełną ścieżkę URL odniesienia w dataSnapshot (JavaScript API)

var firebaseARef = new Firebase("http://this.is.my/firebase/url/A/reference") 
var firebaseBRef = new Firebase("http://this.is.my/firebase/url/B/reference") 

Kiedy definiować moje .on() funkcje, chciałbym określić pojedynczy obsługi, a następnie zrobić wszystko obsługi w jednym miejscu w moim kodzie, zamiast definiowania funkcji zgodnie z definicją .on(). Aby zilustrować:

var handleAllFirebaseStuff = function(dataSnapshot){ 
    var name = dataSnapshot.name(); //PROBLEM HERE: returns "reference", no way to distinguish! 
    switch(name){ 
     case "http://this.is.my/firebase/url/A/reference": //How do I get this full reference from dataSnapshot? 
      /* do stuff for A reference */ 
     case "http://this.is.my/firebase/url/B/reference": //How do I get this full reference from dataSnapshot? 
      /* do stuff for B reference */ 
     default: 
      break; 
    } 
} 

firebaseARef.on('value', handleAllFirebaseStuff); 
firebaseBRef.on('value', handleAllFirebaseStuff); 

Problemem jest dataSnapshot.name() tylko powrócić "reference" w obu przypadkach, co niemożliwe do rozróżnienia między tymi dwoma odniesień w instrukcji switch/case!

Jestem pewien, że dataSnapshot zawiera tę informację gdzieś, ale mam jeszcze do odkrycia go w dowolny sposób. Eksplorując obiekt dataSnapshot w konsoli, stwierdzam, że istnieje obiekt ukryty pod nazwą path, który zawiera (między innymi) tablicę, korzystając z powyższego przykładu, która zawierałaby ["firebase", "url", "A", "reference"], ale nie ma łatwego dostępu do niej.

Gdybym miał dostęp do tej tablicy, mógłbym odbudować adres URL lub znaleźć wygodniejszy sposób obsługi instrukcji switch/case. Myślę, że pełny ciąg odniesienia byłby bardziej odpowiedni jako łatwo dostępna wartość z dataSnapshot.

+0

Szukasz 'snapshot.ref(). ToString()'? –

+0

To jest ten! To jest udokumentowane w API JavaScript Firebase byłoby ogromnie pomocne! Jeśli chcesz podać odpowiedź, z przyjemnością ją zaakceptuję ... – MandM

Odpowiedz

16

Aby wrócić z Snapshot do pełnego adresu URL, możesz zrobić:

snapshot.ref().toString() 

toString część jest dość intuicyjne. Często czuję, że muszę go przetestować, aby sprawdzić, czy to rzeczywiście jest droga.

wskazówkę Byłoby miło, gdyby nie było również bardziej wyraźne getUrl metoda wskazówkę

UPDATE:

Z ostatnich wersji SDK ref is no longer a function, więc będziesz musiał użyć:

snapshot.ref.toString(); 
+0

Tak! Dokumentacja API dla 'DataSnapshot.ref()' w całości jest "referencją Firebase dla lokalizacji, która wygenerowała ten DataSnapshot." Oczywiście jest tu więcej zakopanych (tj. .ref(). ToString()) - zobaczmy więcej dokumentacji! (lub bardziej pomocne metody jawne _hint hint_) – MandM

+0

Cieszę się również, że toString() działa, ale jest to metoda nieudokumentowana nieco mnie przeraża - co, jeśli metoda całkowicie zmieni się w funkcjonalności między obrotami Firebase? (Nie ma gwarancji, że tak się stanie!) Tak więc zgadzam się z całym stwierdzeniem dotyczącym metody jawnej - Firebase powinien to zrobić. – MandM

+0

Fakt, że 'ref.toString()' zwraca pełny adres URL jest udokumentowany: https://www.firebase.com/docs/web/api/firebase/tostring.html "Pobiera bezwzględny adres URL odpowiadający tej lokalizacji odniesienia Firebase . " –