AngularFire проверить, существует ли элемент с таким же названием


У меня есть записи Firebase в /items со свойствами title и points. Я пытаюсь проверить, существует ли элемент того же title, прежде чем вводить новый.

Вот что у меня есть, но этого не происходит:

app.controller('ItemController', function($scope, FURL, $firebase, $location, toaster) {

  var ref = new Firebase(FURL);
  var fbItems = $firebase(ref.child('items')).$asArray();

  $scope.addItem = function(item) { 

    // var iItem = $scope.item.title;

    var userId = $scope.item.title;
      checkIfUserExists(userId);
        };

    function userExistsCallback(userId, exists) {
      if (exists) {
        alert('user ' + userId + ' exists!');
      } else {
        alert('user ' + userId + ' does not exist!');
      }
    }

    function checkIfUserExists(userId) {
      ref.child('items').once('value', function(snapshot) {
        var exists = (snapshot.val() !== null);
        userExistsCallback(userId, exists);
      });
    }

});
1 2

1 ответ:

База данных реального времени-это база данных ключа/значения JSON. Это означает, что Если вы сохраняете имя заголовка в качестве ключа , то его поиск будет очень быстрым.

Возьмем для примера следующие данные.

{
  "items": {
    "title-1": {
       "something": "foo"
    },
    "title-2": {
       "something": "baz"
    }
  }
}

Теперь предположим, мы хотим проверить, чтобы увидеть, если title-2 Существует. Мы можем сделать это с легким чтением.

function checkForTitle(title, cb) {
  var itemsRef = new Firebase('<my-firebase-app>/items');
  var titleRef = itemRef.chld(title).once('value', function(snap) {
     cb(snap.exists());
  });
}

checkForTitle('title-2', function(doesExist) {
  console.log(doesExist); // true
});
Чтобы убедиться, что проверка происходит на сервере, вы можете написать для него правило безопасности . Или, еще лучше, использовать новый Болт Компилятор.
{
  "items": {
     "$item": {
       ".write": "!data.exists()" // don't overwrite existing data
     }
   }
}

Вам следует обновить версию AngularFire.Я заметил, что вы используете $firebase().$asArray, что означает, что вы находитесь на версии 0.9 AngularFire, которая не поддерживается. Посмотрите на обновление до версии 1.0+, которая официально поддерживается Firebase.