使用AngularJS删除Firebase中的单个项目

时间:2015-04-03 18:46:42

标签: angularjs firebase

我正在努力了解如何使用AngularJS从Firebase中的对象中删除单个项目。

这是我的Firebase(只有有趣的一点):

projects
 |
 `--- $id
 |     `-- Name
 |     `-- CreatorID
 |
user_project
 |
 `--- CreatorID
       `-- projectid

每次用户创建条目时,相同的条目都会添加到条目中,其创建者ID等于我从Firebase简单登录中获得的用户ID。同时,我的代码在user_entries / CreatorID中创建了一个新项目(因此我有一个与每个用户关联的条目列表)。

示例:

projects
 |
 `--- JlagYdBNX1gyMVCoXBF
 |     `-- Name: "Activity 1"
 |     `-- CreatorID: "simplelogin:29"
 |
user_projects
 |
 `--- simplelogin:29
       `--JleI106xJgZf6_mGHUI: "JlagYdBNX1gyMVCoXBF"

现在我的问题是我可以删除一个条目,但我不知道如何跟踪并从user_entries中删除相同的内容(这样我就会有很多孤儿)。

我正在使用工厂:

app.factory('Project', function ($firebase, FIREBASE_URL) {
  var ref = new Firebase(FIREBASE_URL);
  var projects = $firebase(ref.child('projects')).$asArray();

  var Project = {
    all: projects,
    create: function (project) {
      return projects.$add(project).then(function(projectRef) {
        $firebase(ref.child('user_projects').child(project.creatorUID))
        .$push(projectRef.name());
        return projectRef;
      });
    },
    delete: function (project) {
      var userid = project.creatorUID;
      return projects.$remove(project).then(function(projectRef) {
        //$firebase(ref.child('user_projects').child(userid))
        console.log(project.$id);
      });
    },
  };

  return Project;

});

我知道$ remove有一个回调返回已处理项目的$ id,所以我尝试将 delete 更改为:

delete: function (project) {
  var userid = project.creatorUID;
  return projects.$remove(project).then(function(projectRef) {
    $firebase(ref.child('user_projects').child(userid))
    .$remove(projectRef.$id);
  });
},

但我得到

错误:Firebase.child失败:第一个参数是无效路径:" undefined"。路径必须是非空字符串,并且不能包含"。","#"," $"," [& #34;,或"]"

有关如何解决此问题的任何提示?

2 个答案:

答案 0 :(得分:1)

AngularFire documentation表示传递给promise回调的对象是常规Firebase对象,而不是AngularFire引用。这意味着您需要使用.key()而不是.$id

delete: function (project) {
  var userid = project.creatorUID;
  return projects.$remove(project).then(function(projectRef) {
    $firebase(ref.child('user_projects').child(userid))
    .$remove(projectRef.ref());
  });
},

答案 1 :(得分:0)

这可能不是最干净的解决方案,但我找到了一种方法来实现我需要将user_projects条目id的唯一ID保存到项目本身:

 create: function (project) {
      return projects.$add(project).then(function(projectRef) {
        var projectId = projectRef.name();
        $firebase(ref.child('user_projects').child(project.creatorUID))
        .$push(projectId).then(function(userProjectRef) {
          var userProjectId = userProjectRef.name();
          $firebase(ref.child('projects').child(projectId).child('LinkID')).$set(userProjectId);
        });
        return projectRef;
      });
    },

所以,在我的火力基地,我得到了:

projects
 |
 `--- JlagYdBNX1gyMVCoXBF
 |     `-- Name: "Activity 1"
 |     `-- CreatorID: "simplelogin:29"
 |     `-- LinkID: "JleI106xJgZf6_mGHUI"
 |
user_projects
 |
 `--- simplelogin:29
       `--JleI106xJgZf6_mGHUI: "JlagYdBNX1gyMVCoXBF"

然后删除条目要容易得多:

delete: function (project) {
  var userId = project.creatorUID;
  var userProjectId = project.LinkID;
  return projects.$remove(project).then(function(projectRef) {
 $firebase(ref.child('user_projects').child(userId)).$remove(userProjectId);
  });
},