2015-08-01 2 views
1

Моя firbase база данных выглядит следующим образом:Как обойти уникальный ID и ссылки на дочерние узлы

app 
    users 
     -gn4t9u4ut304u9g4 
      email 
      uid 

Как ссылаться на адрес электронной почты и идентификатор пользователя? Когда я пытаюсь это:

 $rootScope.dashtype.child('users').orderByChild('uid').equalTo($rootScope.auth.uid).on('value', function(snapshot){ 
      $rootScope.user = snapshot.val(); 
      console.log($rootScope.user); 
     }) 

Я получаю правильный объект, но с уникальным идентификатором в качестве корня:

Object {-JvaZVrWGvJis0AYocBa: Object} 

И потому, что это динамическое свойство, я не знаю, как ссылаться на дочерние объекты. Я просто хочу иметь доступ к полям пользователя следующим образом: $ rootScope.user.email и т. Д.

+0

«-gn4t9u4ut304u9g4» не является UID. Это уникальный идентификатор, который Firebase автоматически создает, когда вы что-то нажимаете. Из-за этого я не сейчас, как ссылаться на поля пользователя. –

+1

Мое первоначальное замечание было наполовину задумано и случайно отправлено - оно было удалено. Поскольку вы знаете uid пользователя, которого хотите ($ rootScope.auth.uid), вы можете захотеть использовать uid в качестве имени узла для каждого пользователя. Есть несколько преимуществ в том, что он упростит ваш вышеуказанный код, поскольку пользовательский узел может быть непосредственно прочитан с помощью чего-то вроде: var ref = new Firebase (FIREBASE_URL + '/ users /' + authUser.uid). Кроме того, это может упростить правила безопасности записи, так как переменная типа $ user_id может использоваться для обозначения имени каждого узла (uid). – Jay

+1

@Jay Да, это то, что я хочу, но проблема в том, что Firebase ID (Timestamp) автоматически создается как корень для моих пользовательских данных. Поэтому, делая это, как вы предлагаете, все равно будет выглядеть так: FIREBASE_URL + '/ users/* FirebaseID * /' + authUser.uid). Если только был способ отключить отметку времени при вызове Push. –

ответ

3

Поскольку вы запрашиваете значение, вы получаете список пользователей в результате. Это может быть только один пользователь, но он по-прежнему является одним из них.

Вы должны перебрать снимок, чтобы добраться до дочернего узла:

$rootScope.dashtype.child('users').orderByChild('uid').equalTo($rootScope.auth.uid).on('value', function(snapshot){ 
    snapshot.forEach(function(userSnapshot) { 
     $rootScope.user = userSnapshot.val(); 
     console.log($rootScope.user); 
    }); 
}); 

Поскольку существует только один пользователь в списке, то цикл для выполнения только один раз.

Вы смешиваете обычный Firebase JavaScript с AngularFire здесь. Это означает, что вам нужно будет сообщить AngularJS, что вы обновили рамки, так что он будет засавить мнение:

$rootScope.dashtype.child('users').orderByChild('uid').equalTo($rootScope.auth.uid).on('value', function(snapshot){ 
    snapshot.forEach(function(userSnapshot) { 
     $timeout(function() { 
      $rootScope.user = userSnapshot.val(); 
      console.log($rootScope.user); 
     }); 
    }); 
}); 
+2

Это работает. Благодарю. Но это просто кажется чрезмерным для задачи, которую я хочу преформировать. Если бы не глупый Firebase ID, я мог бы просто сделать это: $ rootScope.user = new Firebase ("https://dashtype.firebaseio.com/users/uid"); –

+1

Почему вы храните пользователей под идентификатором push? Я почти уверен, что примеры в документации Firebase хранят пользователей по их 'uid'. https://www.firebase.com/docs/web/guide/user-auth.html#section-storing (Джей сказал то же самое в своем комментарии кстати) –

+2

Хороший вопрос! Я не думал, что у меня может быть несколько объектов под «пользователями», если я использовал set(), и поэтому мне пришлось использовать push(). Интуитивно я думал о set() и push() как String и Array в Javascript, но эта ментальная модель не совсем подходит. Это должно было быть объяснено лучше в документах для таких глупых людей, как я. –

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