【问题标题】:Delete single item in Firebase with AngularJS使用 AngularJS 删除 Firebase 中的单个项目
【发布时间】:2015-04-04 16:32:02
【问题描述】:

我有点难以理解如何使用 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 失败:第一个参数是无效路径:“未定义”。路径必须是非空字符串,并且不能包含“.”、“#”、“$”、“[”或“]”

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

【问题讨论】:

  • 我假设您已经尝试过.$remove(project.$id)?显然from the docs 传递给回调的对象是一个常规的 Firebase 对象,不是一个 Angular firebase 对象。我不知道他们为什么决定这样做。
  • 当然,按照文档,您应该能够使用.$remove(projectRef.key())
  • 是的,我尝试使用project.$id,但没有运气。但我想这是因为project.$id 是值,而不是 user_projects 中的键。

标签: angularjs firebase


【解决方案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());
  });
},

【讨论】:

  • 哦,我现在明白了...我之前尝试过,我得到了这个:Error: Firebase.child failed: First argument was an invalid path: "https://my_firebase.firebaseio.com/projects/-Jm24tOoN23k5PFhoNGB". Paths must be non-empty strings and can't contain ".", "#", "$", "[", or "]"
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2018-08-31
    • 1970-01-01
    • 1970-01-01
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    • 2017-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多