希望我能在第一时间以精确的方式确定这个问题的重点,所以这里什么都没有:
我正在尝试创建一个应用程序,使用户能够为自己选择的项目添加书签。但是,使用Firebase数据结构时,我不知道如何检查用户是否已将所显示的项目添加为书签。
HTML的相关部分是:
<ul ng-controller="itemCtrl">
<li class="list-item" ng-repeat="item in items">
<a ng-href="/item/{{item.$id}}">{{item.title}}</a>
<div class="item-actions">
<a ng-if="!item.isBookmarked" ng-click="addUserBookmark(item)" class="addBM" href="">Bookmark Item</a>
<a ng-if="item.isBookmarked" ng-click="deleteUserBookmark(item)" class="deleteBM" href="">Remove Bookmark</a>
</div>
</li>
</ul>
目前,用于书签项目的服务和控制器设置如下:
.controller('itemCtrl', function ($scope, itemService, User) {
$scope.items = itemService.all;
$scope.addUserBookmark = function(item){
var user = User;
itemService.addBookmark(user, item);
};
})
.service('itemService', function($firebase, RootURL, User) {
var rootRef = new Firebase(RootURL);
var itemArray = $firebase(rootRef.child('item')).$asArray();
return: {
all: return itemArray;
addBookmark: function (user, item) {
var itemData = {
itemID: item.$id,
title: item.title,
};
var userData = {
userID: user.userID,
username: user.username
};
var itemBookmarks = $firebase(rootRef.child('items').child(itemData.itemID).child('bookmarks')).$asArray();
itemBookmarks.$add(userData);
},
};
})
我对这个领域有点新手,我可能完全以错误的方式解决这个问题。所以,不用说,我会非常感谢任何有关如何继续的建议。我猜我应该设置一个查询,但是按照目前的设置,书签会保存为Firebase记录,其中包含唯一的记录名称,这使我无法确定要查询的内容,何时查询以及如何以有效的方式查询。 (如果对这个问题的任何答案都超出了广度,我会道歉。)
------更新:数据结构-------
Root FBURL
用户
产品
我知道有更多可用的最佳数据结构(可能有书签占据了自己的顶级树),但我认为最好使用更传统的方法,直到我更全面地了解在Firebase中处理数据的基础知识
对于另一个更简化问题的尝试:如何查询数据库以查看用户是否为某个项目添加了书签?
答案 0 :(得分:1)
您在应用程序中结合了一些复杂的技术,但您的问题似乎主要与查询Firebase本身有关。在本回答中,我将重点介绍如何使用Firebase's standard Web/JavaScript API进行查询。
我建议将书签置于顶级,而不是将它们嵌套到用户或项目的数据中。这直接来自Firebase's recommendation to avoid building deeply nested hierarchies。
Users: [
{
Username: "AJeezy9",
Email: "AJeezy9@stackoverflow.com"
},
{
Username: "Frank van Puffelen",
Email: "puf@stackoverflow.com"
}
],
Items: [
{
Title: "How to check if user has bookmarked item",
Url: "http://stackoverflow.com/q/26955078/209103"
},
{
Title: "Firebase JavaScript API",
Url: "https://www.firebase.com/docs/web/api/"
},
{
Title: "Microsoft Developer Network",
Url: "https://msdn.microsoft.com/"
}
],
Bookmarks: [
{ User: 0, Item: 0 },
{ User: 0, Item: 1 },
{ User: 1, Item: 1 },
]
您现在可以使用以下方式“循环”所有项目:
ref.child('Items').on('child_added', function(item) {
// do something with item.val()
});
然后您可以使用以下内容查找项目的所有书签:
var bookmarks = ref.child('Bookmarks')
.orderByChild('Item')
.equalTo(parseInt(item.key()))
.on('value', function(bookmarks) {
console.log('"'+item.val().Title+'" has been bookmarked '+bookmarks.numChildren()+' times');
});
代码应该是不言自明的:
输出:
"How to check if user has bookmarked item" has been bookmarked 1 times
"Firebase JavaScript API" has been bookmarked 2 times
"Microsoft Developer Network" has been bookmarked 0 times"
JSBin供参考:http://jsbin.com/tineco/2/edit