3

我的问题来自导航链接/无休止的滚动。

我为每个微博添加了一个“删除”按钮。当按下该按钮时,服务器会调用 ajax,微博会被删除,而 div 也会从 DOM 中移除。

假设我在第一页有微博 1 到 10,在第二页有微博 11 到 20,等等。假设我删除了第一页上的项目 1、2 和 3。然后向下滚动。服务器会“重新计算”微博;由于我删除了前一个列表中的 3 个,它将返回项目 13 到 22。换句话说,微博 10、11 和 12 不会出现在第一页和第二页上。

在stackoverflow上四处寻找后,我找到了一个解决方案:

每当我从列表中删除微博时,我都会加载页面上最后一条微博之后的微博,并将其插入到底部。

我目前如何进行修复:

默认情况下,我使用 will_paginate gem 在页面上显示 10 个微博。我需要知道在任何给定时间显示的任何微博的 ID。我通过将它存储在包含每个微帖子的容器的开始 div 标签中来实现这一点:

<% @microposts.each do |m| %>
     <div class="postHolder" data-micropost-id="<%= m.id %>">

我在 microposts.js 资产文件中这样访问它:

$(function() {

     $('.message_delete').on('ajax:success', function(event, data, status, xhr){
          console.log(data); //to check if json is working
          console.log($('.postHolder').last().data('micropost-id'));
     });
});

这是我的控制器销毁操作:

def destroy
    micropost = Micropost.find(params[:id])
       respond_to do |format|   
         micropost.destroy
       format.json  { render :json => micropost } #just to check if json is working
    end
end

现在我知道每个微博的 ID,所以当一个微博被删除时,我使用 jquery 选择器对页面上的最后一个 .postHolder div 进行微调,获取 ID,然后使用该 ID 获取紧随其后的微博并在其后插入该微博. 这样,当一条消息被删除时,一条消息会自动附加。

如果用户碰巧滚动以加载更多消息,则不会丢失任何消息。我看过一些 railscasts 并看到 Ryan Bates 使用数据属性做了类似的事情,并阅读了一些关于它们的东西,似乎得到这样的印象是不好的做法。

我试图想出其他方法来做到这一点,但想不出任何办法,但这样做感觉有点奇怪。也许这一切都在我的脑海中,但如果可能的话,我想要另一个更好的解决方案。

谢谢

亲切的问候

4

1 回答 1

1

您可以使用变量来跟踪当前页面上的微博数。每当您删除帖子时,请减少此变量。每当您获取新的帖子页面时,将此变量重置为其默认值(10)。

当您获取新的 10 个帖子时,数据库的偏移量将为(假设您请求微博的第 3 页,并且您从第 2 页删除了 4 个)

(3 * 10) - (4) == 26

第 3 页上的第一个微博现在将是微博 id 26

假设我已经理解了您的问题,那就是!

于 2012-05-23T09:26:10.433 回答