如何检查用户是否有书签项目

时间:2014-11-16 08:10:07

标签: angularjs firebase angularfire

希望我能在第一时间以精确的方式确定这个问题的重点,所以这里什么都没有:

我正在尝试创建一个应用程序,使用户能够为自己选择的项目添加书签。但是,使用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

  • 用户

    • 用户名
    • 电子邮件
    • ...
    • 书签?
      • 的ItemID
  • 产品

    • 的ItemID
    • 标题
    • ...
    • 书签?
      • 用户ID

我知道有更多可用的最佳数据结构(可能有书签占据了自己的顶级树),但我认为最好使用更传统的方法,直到我更全面地了解在Firebase中处理数据的基础知识

对于另一个更简化问题的尝试:如何查询数据库以查看用户是否为某个项目添加了书签?

1 个答案:

答案 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');
  });

代码应该是不言自明的:

  1. 从Bookmarks节点开始
  2. 按项目排序
  3. 仅选择项目匹配的书签
  4. 一次性获取所有匹配的书签
  5. 记录孩子数
  6. 输出:

    "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