将项目推入AngularJS中的嵌套集合

时间:2016-12-16 05:17:37

标签: javascript ruby-on-rails angularjs json

我正在使用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数组中?

这样做的原因是我将网页框上的单个评论发送给网站上的其他用户。

1 个答案:

答案 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将出现在递归数组中,因为它包含与地图相同的对象。