来自嵌套数组的Firebase $ remove()对象?

时间:2016-05-05 16:39:39

标签: arrays firebase javascript-objects

来自嵌套数组的Firebase $ remove()对象?

我无法使用Firebase $remove()方法处理嵌套的对象数组。我正在制作一个包含电影对象数组的电影数据库。从电影数组中删除电影有效:

  $scope.deleteMovie = function() {
    $scope.movie.$remove().then(function() {
      console.log("Movie deleted.");
    }, function(error) {
      console.log(error);
    });
  };

它使用$ firebaseObject $ remove()方法,该方法只挂钩到一个对象上并将其删除。电影通过其键在数组中标识,将movie.$id传递到URL中,然后从URL中抓取键以识别电影并将其放入$scope

  $scope.movie = $firebaseObject(ref.child($routeParams.id));

用户可以为电影添加评论。每个注释都是注释数组中的对象。注释数组是movie对象的属性,因此它是一个二级嵌套的对象数组。使用$ firebaseArray方法$remove(recordOrIndex)似乎更好一点。我将从评论中传递评论:

  $scope.deleteComment = function(comment) {
    console.log(comment);
  };

通过评论:

  Object {commentAuthor: "Eva Braun", commentDate: 1462461704268, commentText: "What's not to like?"}

现在我将使用$remove(comment)删除数组中的注释:

  $scope.deleteComment = function(comment) {
    $scope.movie.movieComments.$remove(comment).then(function() {
      console.log("Comment deleted.");
    }, function(error) {
      console.log(error);
    });
  };

错误消息是“TypeError:$ scope.movi​​e.movi​​eComments。$ remove不是函数”。

所以$scope.movie.$remove()是一个函数,但$scope.movie.movieComments.$remove不是函数。

我检查了这是否是异步问题,但这似乎不是问题。

Firebase不喜欢嵌套对象数组的点表示法。我将使用child()表示法:

$scope.deleteComment = function(comment) {
  $firebaseArray(ref.child($routeParams.id).child('movieComments').remove(comment)).then(function() {
    console.log("Comment deleted.");
  }, function(error) {
    console.log(error);
  });
};

错误消息是“错误:Firebase.remove失败:第一个参数必须是有效的函数。”文档说第一个参数必须是记录或索引。评论在没有密钥的情况下传递,也许这就是问题?

让我们尝试使用索引而不是记录:

  $scope.deleteComment = function(comment) {
    $firebaseArray(ref.child($routeParams.id).child('movieComments').remove(0)).then(function() {
      console.log("Comment deleted.");
    }, function(error) {
      console.log(error);
    });
  };

相同的错误消息:“错误:Firebase.remove失败:第一个参数必须是有效的函数。”

让我们尝试从视图中删除评论:

  <div ng-repeat="comment in movie.movieComments">
    <form>
      <button ng-click="movie.movieComments.$remove(comment)">x</button>
    </form>
  </div>

这没有任何作用。

让我们试试$ remove()的$ firebaseObject版本:

  $scope.deleteComment = function() {
    $firebaseObject(ref.child($routeParams.id).child('movieComments').remove()).then(function() {
      console.log("Comment deleted.");
    }, function(error) {
      console.log(error);
    });
  };

这很棒!除了它删除整个注释数组,当我只想从数组中删除一个注释。让我们添加另一个.child()

  $scope.deleteComment = function(comment) {
    $firebaseObject(ref.child($routeParams.id).child('movieComments').child(comment).remove()).then(function() {
      console.log("Comment deleted.");
    }, function(error) {
      console.log(error);
    });
  };

错误消息是“Firebase.child失败:第一个参数是无效路径:”undefined“。路径必须是非空字符串,不能包含”。“,”#“,”$“,”[ “,或”]“”。

我没有正确识别评论。如何使用密钥:

  $scope.deleteComment = function(comment) {
    console.log(comment);
    $firebaseObject(ref.child($routeParams.id).child('movieComments').child(comment.$id).remove()).then(function() {
      console.log("Comment deleted.");
    }, function(error) {
      console.log("Error, movie not deleted.");
      console.log(error);
    });
  };

相同的错误消息。密钥不在注释中,因此在传递注释时密钥不会被传递。我将通过movie对象和控制台记录movieComments数组。该数组有一个对象:

  Object {-KH0VeEfwIgT1UOUrFzo: Object}
    -KH0VeEfwIgT1UOUrFzo: Object
      commentAuthor: "Eva Braun"
      commentDate: 1462461704268
      commentText: "What's not to like?"

现在我将使用$ keyAt(recordOrIndex)获取密钥:

  $scope.deleteComment = function(movie, comment) {
    console.log(movie.movieComments.$keyAt(comment));
  };

“TypeError:movie.movi​​eComments。$ keyAt不是函数”。我们试试.child()符号:

  $scope.deleteComment = function(movie, comment) {
    console.log(movie.child('movieComments').$keyAt(comment));
  };

“TypeError:movie.child不是函数”。让我们尝试使用索引号:

  $scope.deleteComment = function(movie, comment) {
    console.log(movie.child('movieComments').$keyAt(0));
  };

“TypeError:movie.child不是函数”。好的,$ keyAt(recordOrIndex)和$ remove(recordOrIndex)都不起作用。这表明我的记录或索引有问题。

有关如何从Firebase中的嵌套数组中删除任何对象的任何建议吗?

2 个答案:

答案 0 :(得分:1)

我不确定看到你的所有代码,但我感觉你在firebase只接受一个字符串时传递了一个带有最终.child(注释)的对象。见这一行:

$firebaseObject(ref.child($routeParams.id).child('movieComments').child(comment).remove()).then(function() {

如果您发现我假设的id或键字符串表示是注释对象,则可以将其传递给remove函数。这就是你收到错误的原因。

此外,您可以像

一样链接您的孩子
.child(`${$routeParams.id}/movieComments/comment`)

保持一切更清洁

答案 1 :(得分:0)

我明白了。 Firebase不会使用点表示法,因此不起作用:

  ng-click="movie.movieComments.$remove(comment)"

我在控制器中设置了一个注释数组:

    $scope.comments = $firebaseArray(ref.child($routeParams.id).child('movieComments'));

然后在我设置的视图中:

  <div ng-repeat="comment in comments">
    <button ng-click="comments.$remove(comment)"></button>
  </div>

完美无缺!

Firebase文档中存在错误。在“同步对象”教程中,它给出了这个示例:

  {
    "profiles": {
      "physicsmarie": {
        name: "Marie Curie",
        dob: "November 7, 1867"
      }
    }
  }

这是一个JavaScript对象。 Firebase对象如下所示:

  {
    $id: "-KGSpDSJEtvCHetr5679",
    {
      "profiles": {
        $id: "-KGSpDSJ43er5t3udghoe",
       {
         "physicsmarie": {
         $id: "-KGSpDSJEtvCHNeXWriS",
         {
           name: "Marie Curie",
           dob: "November 7, 1867"
            }
          }
        }
      }
    }
  }

这就是为什么你不能在Firebase中使用点符号。 Firebase对象是嵌套的双重对象,其中键作为外部对象的第一个属性,内部对象作为第二个属性。您必须使用.child()表示法。