Javascript 更改来自服务器的响应上的ng重复数据

Javascript 更改来自服务器的响应上的ng重复数据,javascript,json,angularjs,Javascript,Json,Angularjs,我有一个表,它的行是用ng repeat创建的,这取决于有多少帖子。单击后,我将posts新状态放到服务器上,服务器将发送回更新后的post对象。这个很好用 我的问题是,当ng repeat包含如下所示的| orderBy:'-created_at'时,在返回新对象时,我无法使用新对象更新正确的帖子。传递给函数的索引在某种程度上是不同的。当我卸下过滤器时,它会按预期工作 请注意,在此代码中%%%%是ng bind而不是{{} Html 以下函数按照我的预期工作,如果remPost是ng repe

我有一个表,它的行是用ng repeat创建的,这取决于有多少帖子。单击后,我将posts新状态放到服务器上,服务器将发送回更新后的post对象。这个很好用

我的问题是,当ng repeat包含如下所示的| orderBy:'-created_at'时,在返回新对象时,我无法使用新对象更新正确的帖子。传递给函数的索引在某种程度上是不同的。当我卸下过滤器时,它会按预期工作

请注意,在此代码中%%%%是ng bind而不是{{}

Html


以下函数按照我的预期工作,如果remPost是ng repeat中的post对象。如果有人有更雄辩的解决方案,我很乐意听到

$scope.toggleStatus = function (postid, status, remPost) {
        var input = {};

        console.log(remPost);

        if (status === 'DRAFT') {
            input.status = 'APPROVED'; 
        }

        if (status === 'APPROVED') {
            input.status = 'DRAFT';
        }

        $http.put('/posts/' + postid, input).success(function (data, status) {

            for (var i = 0, ii = $scope.posts.length; i < ii; i++) {
                if ($scope.posts[i] === remPost) {
                    $scope.posts[i] = data;
                }
            }
        });
    };
$scope.toggleStatus=函数(postid、status、remPost){
var输入={};
控制台日志(remPost);
如果(状态=='DRAFT'){
input.status=‘已批准’;
}
如果(状态==‘已批准’){
input.status='DRAFT';
}
$http.put('/posts/'+postid,input).success(函数(数据,状态){
对于(变量i=0,ii=$scope.posts.length;i
比较帖子ID,比较对象不是一个好主意,我想。所以现在您不需要将
remPost
作为参数发送

    $http.put('/posts/' + postid, input).success(function (data, status) {

        for (var i = 0, ii = $scope.posts.length; i < ii; i++) {
            if ($scope.posts[i].id === postid) {
                $scope.posts[i] = data;
            }
        }
    });
$http.put('/posts/'+postid,input)。成功(函数(数据,状态){
对于(变量i=0,ii=$scope.posts.length;i
当你切换/update/put时,你是返回所有帖子还是只返回一篇?服务器只返回更新过的帖子,既然你提到了,我想我可以在服务器上将其更改为返回所有帖子,从而停止额外的http请求,但这是一个不必要的db调用。我同意。我有一些类似的东西,但我将其与jQuery dataTable插件指令一起使用。让我想想,帮我试试这个,因为我可以从这里开始。返回数据后,执行
console.log($scope.posts[index])
并查看ID是否匹配,即,这是否是您刚刚更新的行/帖子?不太多,但deco会有帮助吗?您是否比较if块中的对象?什么是
remPost
?调用toggleStatus时,将post对象作为第三个属性传递给它,这就是所谓的remPost(我是新手,抱歉:p我不知道wtf如何命名。for循环遍历controllers scope.posts对象中的所有post对象,并将它们与remPost进行比较,当它找到匹配的对象时,它将其设置为与从服务器返回的数据相等,这听起来也比将对象与我进行比较好。)
$scope.toggleStatus = function (postid, status, remPost) {
        var input = {};

        console.log(remPost);

        if (status === 'DRAFT') {
            input.status = 'APPROVED'; 
        }

        if (status === 'APPROVED') {
            input.status = 'DRAFT';
        }

        $http.put('/posts/' + postid, input).success(function (data, status) {

            for (var i = 0, ii = $scope.posts.length; i < ii; i++) {
                if ($scope.posts[i] === remPost) {
                    $scope.posts[i] = data;
                }
            }
        });
    };
    $http.put('/posts/' + postid, input).success(function (data, status) {

        for (var i = 0, ii = $scope.posts.length; i < ii; i++) {
            if ($scope.posts[i].id === postid) {
                $scope.posts[i] = data;
            }
        }
    });