说我有以下内容:
var firebaseARef = new Firebase("http://this.is.my/firebase/url/A/reference") var firebaseBRef = new Firebase("http://this.is.my/firebase/url/B/reference")
当我定义我的.on()函数时,我想指定一个处理程序,然后在我的代码中的一个地方执行所有处理,而不是必须使用.on()定义内联定义函数.为了显示:
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);
问题是dataSnapshot.name()只会在两种情况下都返回“reference”,因此无法区分switch / case语句中的两个引用!
我确定dataSnapshot在某个地方包含这些信息,但我还没有以任何方便的方式发现它.在控制台中探索dataSnapshotobject,我发现有一个隐藏在被调用路径中的对象,其中包含(除其他外)一个数组,使用上面的例子,它将包含[“firebase”,“url”,“A”,“引用“],但没有简单的方法来访问它.
如果我有权访问该数组,我可以重建URL或找到一种更方便的方法来处理switch / case语句.我认为完整的参考字符串更适合作为dataSnapshot中易于访问的值.
解决方法
要从快照返回到完整URL,您可以:
snapshot.ref().toString()
toString部分有点违反直觉.我经常发现自己不得不对它进行测试,看看是否真的要走了.
更新:
最近的SDK版本为ref
is no longer a function,因此您必须使用:
snapshot.ref.toString();