2

我有/items的Firebase條目,屬性爲titlepoints。我正在嘗試檢查是否存在相同title的項目,然後再輸入新項目。AngularFire檢查相同標題的項是否存在

這是我有,但它不會發生:

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

實時數據庫是一個鍵/值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 
}); 

要確保檢查情況發生在服務器上,你可以爲它編寫一個安全規則。或者,更好地使用新的Bolt Compiler

{ 
    "items": { 
    "$item": { 
     ".write": "!data.exists()" // don't overwrite existing data 
    } 
    } 
} 

您應該升級您的AngularFire版本。我注意到你正在使用$firebase().$asArray這意味着你在使用AngularFire的0.9版本,這是不受支持的。考慮升級到由Firebase正式支持的1.0+版本。

+0

對不起是AngularFire的多維數據集,但如何將標題名稱作爲關鍵字保存我的項目? –

+0

這取決於你在做什麼。您可能不需要AngularFire,只需使用帶ref.child('title-2')的Firebase SDK。set({title:'title-2'});'。 AngularFire用於同步數據,保存數據並不總是需要下載。 –

+0

謝謝。在這一點上,我不認爲有任何需要同步數據。 –