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

Delete single item in Firebase with AngularJS

我有点难以理解如何使用 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"。路径必须是非空字符串,不能包含“.”、“#”、“$”、“[”或“]”

关于如何解决这个问题的任何提示?

AngularFire documentation indicates that the object passed to the promise callback is a regular 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());
  });
},

它可能不是最干净的解决方案,但我找到了一种方法来实现我需要的,将 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;
      });
    },

因此在我的 firebase 中我得到:

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);
  });
},