我正在使用Rails gem acts_as_commentable_with_threading。它很棒。
我也在使用AngularJS作为前端。我有一个控制器,为要呈现的注释返回以下JSON:
[
{
"comment":{
"id":1,
"commentable_id":1,
"commentable_type":"Post",
"title":null,
"body":"This is a very cool comment!",
"subject":null,
"user_id":5,
"parent_id":null,
"lft":1,
"rgt":4,
"created_at":"2016-12-16 03:50:24",
"updated_at":"2016-12-16 03:51:24"
},
"children":[
{
"comment":{
"id":2,
"commentable_id":1,
"commentable_type":"Post",
"title":null,
"body":"I definitely think this is cool too.",
"subject":null,
"user_id":7,
"parent_id":null,
"lft":2,
"rgt":3,
"created_at":"2016-12-16 03:51:06",
"updated_at":"2016-12-16 03:51:24"
},
"children":[
]
}
]
}
]
如果有人选择回复ID为2的评论,则意味着新创建的评论将被插入到所述评论的children
数组中。有角度的方法吗?或者我会基本上编写自己的递归函数来循环遍历每个注释及其子项,直到我找到具有相同ID的注释对象并将新注释推送到children数组中?
这样做的原因是我将网页框上的单个评论发送给网站上的其他用户。
答案 0 :(得分:0)
您可以将地图维护为注释嵌套数组的平面版本。您需要递归循环注释数组并将所有元素添加到地图中(一次,在呈现注释之前)。
例如:
function addCommentsToMap(comments, commentsMap ) {
comments.forEach(function(comment) {
commentsMap[comment.id] = comment;
addCommentsToMap(comment.children, commentsMap );
});
}
var commentsMap = {};
addCommentsToMap(comments, commentsMap);
拥有这样的地图可以只用一个操作插入注释。当一条新评论出现时,你可以简单地说出来:
commentsMap[parentCommentId ].children.push(newComment);
之后,newComment将出现在递归数组中,因为它包含与地图相同的对象。