Angular回调数组推送问题

时间:2016-06-08 09:14:37

标签: javascript angularjs callback angularjs-scope angularjs-ng-repeat

我正在尝试创建一个评论部分,类似于instagram的评论部分,其中显示评论列表,以及每个评论的用户个人资料和用户名。

我在解析中有一个注释表,在解析中有一个用户表,因此我必须对每个注释执行进一步的查询以获取个人资料图片链接和用户名。

我正在使用角度来做到这一点。我有一个注释数组来存储所有的提交,我正在将一个对象推送到这个数组包含: - 用户名 - 个人资料图片 - 评论

var commentQuery = parseQuery.new('Comment');
commentQuery.equalTo("ID", id);
parseQuery.find(commentQuery)
.then(function(results) {
    for(var i =0; i < results.length; i++){
        var comment = results[i].get('comment');
        var userQuery = parseQuery.new('_User');
        userQuery.equalTo("objectId", results[i].get('userObject')[0].id);
        parseQuery.find(userQuery)
        .then(function(user) {  
            var commentObject = {
               comment: comment,
               username : '',
               profile: ''
        }
            commentObject['profile'] = user[0].get('profile_picture')['_url'];
            commentObject['username'] = user[0].get('liveUsername');
            $scope.comments.push(commentObject);    
        })
    }   
})

然后在我的ng-repeat中产生的是一个列表,其中包含正确的注释数量,但所有注释都是相同的!

如果我将注释打印到控制台,因为它们是下载的,它们是正确的。在出现问题的对象创建中,相同的数据放在所有注释对象中。

enter image description here

3 个答案:

答案 0 :(得分:1)

$scope.comments包含乘法$scope.commentObject,因此当您更改$scope.commentObject时,它会在整个数组中发生变化。您可以在.then(function(user) {回调中创建新的var并将其推送到数组。

答案 1 :(得分:0)

@OP事情是$ scope.commentObject是一个引用,所以当你更新这个对象时,它的所有引用都会更新为相同的值。 考虑这个例子:

var list=[];
$scope.obj="a";
list.push($scope.obj);
console.log(list);  //it will print ['a']
$scope.obj="b";
console.log(list);  //it will print ['b'] , even though  we haven't pushed any new value in the list. 

您看到的问题是您一次又一次地推送相同的参考。 要解决此问题,请将代码更改为以下内容:

parseQuery.find(userQuery)
    .then(function(user) {  
        var commentObject = {
           comment: comment,
           username : '',
           profile: ''
    }
        commentObject['profile'] = user[0].get('profile_picture')['_url'];
        commentObject['username'] = user[0].get('liveUsername');
        $scope.comments.push(commentObject); 
    })

答案 2 :(得分:0)

提供的解决方案是正确的,如果如上所述,您仍然有相同的注释,您应该手动检查它在用户表中的内容