来自嵌套数组的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.movie.movieComments。$ 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.movieComments。$ 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中的嵌套数组中删除任何对象的任何建议吗?
答案 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()
表示法。