允许用户拖放表格行以更改其顺序的最简单方法是什么?

时间:2020-03-06 15:05:08  来源:igfitidea点击:

我有一个正在编写的Ruby on Rails应用程序,用户可以选择编辑发票。他们需要能够重新分配行的顺序。现在,我在数据库中有一个索引列,用作默认的排序机制。我刚刚公开了该内容,并允许用户对其进行编辑。

这不是很优雅。我希望用户能够拖放表格行。我使用了Scriptaculous和Prototype有点,对它们也很熟悉。我已经完成了拖放列表,但是还没有像这样完成表格行。任何人都不仅对重新排序有什么建议,还可以有效地捕获重新排序吗?

另外,用户现在可以在JS中动态创建新行,因此该行也必须可重新排序。

如果可以用RJS代替直接的JavaScript,则可以加分。

解决方案

我以前曾使用Yahoo用户界面库执行此操作:

http://developer.yahoo.com/yui/dragdrop/

自从它内置以来,脚本式的可排序对象似乎就是要走的路。
http://github.com/madrobby/scriptaculous/wikis/sortable

Yahoo界面比我预期的要简单,在不到四个小时的时间内就能完成令人眼花something乱的工作。

MooTools可排序项实际上是优于script.aculo.us的,因为它们是动态的。 MooTools允许在列表中添加/删除项目。当将新项目添加到script.aculo.us可排序时,我们必须销毁/重新创建可排序项以使新项目可排序。如果列表中包含很多元素,这样做会产生很多开销。由于这个限制,我不得不从script.aculo.us切换到更轻量级的MooTools,最终对这个决定感到非常满意。

MooTools使新添加的项目可排序的方式是:

sortables.addItems(node);

好的,我进行了更多的搜索,并找出了似乎最有效的方法。

edit.html.erb:

...
<table id="invoices">
   <thead>
     <tr>
      <th>Id</th>
      <th>Description</th>
     </tr>
   </thead>
   <tbody id="line_items">
      <%= render :partial => 'invoice_line_item', :collection => @invoice.invoice_line_items.sort %>
   </tbody>
</table>

<%= sortable_element('line_items', {:url => {:action => :update_index}, :tag => :tr, :constraint => :vertical}) -%>
...

app / controllers / invoices.rb

...
def update_index
  params["line_items"].each_with_index do |id, index|
    InvoiceLineItem.update(id, :index => index)
  end
  render :nothing => true
end
...

重要的部分是" sortable_element"和params [" line_items"]中的:tag =>:tr-这给出了新的ID列表,并在放置时触发。

缺点:使AJAX调用掉落,我想我更喜欢存储订单并在用户点击"保存"时进行更新。在IE上未经测试。

我喜欢jQuery http://docs.jquery.com/UI/Sortables

$("#myList")。sortable({});

我们将需要编写一些代码来使其持久化,但这并不难。