所谓的 Ajax 拖拉 UI,就是直接用鼠标进行拖拉排序,这种方式对用户来说操作速度更快。

拖拉的 UI 需要额外的前端套件,这里介绍 jQuery UI 的 Sortable Plugin,并直接使用 jquery-ui-rails 这个 gem 来安装

编辑 Gemfile

Gemfile

+  gem 'jquery-ui-rails'

编辑 app/assets/javascripts/admin.js

app/assets/javascripts/admin.js

  //= require bootstrap-datepicker/core
//= require bootstrap-datepicker/locales/bootstrap-datepicker.zh-CN
//= require ckeditor/init
+ //= require jquery-ui

编辑 app/assets/stylesheets/admin.scss,其中 .sortable_icon 是给画面中可被拖拉的 ☰ 的样式

app/assets/stylesheets/admin.scss

+  @import "jquery-ui";
+
+ .sortable .sortable_icon {
+ border: none;
+ color: #ECECEC;
+ font-size: 20px;
+ cursor: move;
+ padding-right: 10px;
+ }

执行 bundle,重启服务器

编辑 app/views/admin/events/index.html.erb

app/views/admin/events/index.html.erb

   <table class="table">
+ <thead>
<tr>
<th><%= check_box_tag "全选", "1", false, :id => "toggle_all" %></th>
<th>Event Name</th>
<th>Actions</th>
</tr>
+ </thead>
+ <tbody class="sortable">
<% @events.each do |event| %>
- <tr>
+ <tr data-reorder-url="<%= reorder_admin_event_path(event) %>">
<td>
<%= check_box_tag "ids[]", event.id %>
</td>
- <td><%= link_to event.name, admin_event_path(event) %></td>
+ <td>
+ <span class="sortable_icon">☰</span>
+ <%= link_to event.name, admin_event_path(event) %>
+ </td>
<td>
- <%= link_to "上移", reorder_admin_event_path(event, :position => :up), :method => :post, :class => "btn btn-default" %>
- <%= link_to "下移", reorder_admin_event_path(event, :position => :down), :method => :post, :class => "btn btn-default" %>
<%= link_to "置顶", reorder_admin_event_path(event, :position => :first), :method => :post, :class => "btn btn-default" %>
<%= link_to "置底", reorder_admin_event_path(event, :position => :last), :method => :post, :class => "btn btn-default" %>
<%= link_to "Tickets", admin_event_tickets_path(event), :class => "btn btn-default" %>
<%= link_to "Edit", edit_admin_event_path(event), :class => "btn btn-default" %>
<%= link_to "Delete", admin_event_path(event), :method => "delete", :data => { :confirm => "Are you sure?" }, :class => "btn btn-danger" %>
</tr>
<% end %>
+ </tbody>
</table>
<p>
<%= select_tag :event_status, options_for_select( Event::STATUS.map{ |s| [t(s, :scope => "event.status"), s] }), :class => "form-control" %>
<%= submit_tag t(:bulk_update), :class => "btn btn-primary" %>
<%= submit_tag t(:bulk_delete), :class => "btn btn-danger", :data => { :confirm => "Are you sure?" } %>
</p>
<% end %> <script>
$("#toggle_all").click(function(){
if ( $(this).prop("checked") ) {
$("input[name='ids[]']").prop("checked", false);
}
}) + $( ".sortable" ).sortable({
+ axis: 'y', // 限制只能上下拖拉
+ items: 'tr', // 拖拉整个 tr
+ cursor: 'move', // 变更拖拉时的 icon
+ handle: ".sortable_icon", // 限制只有点 ☰ 才能开始拖拉,砍掉这行的话,会是整个 tr 都可以进行拖拉,你可以试试看
+ stop: function(e, ui){ // 当拖拉结束时,会调用这个方法
+ ui.item.children('td').effect('highlight', {}, 1000)
+ },
+ update: function(e, ui) { // 当拖拉结束并且 DOM 上的位置变更时,会调用这个方法
+ reorder_url = ui.item.data('reorder-url')
+ position = ui.item.index() // 取得顺序
+ $.ajax({
+ type: 'POST',
+ url: reorder_url,
+ dataType: 'json',
+ data: { position: position }
+ })
+ }
+ });
</script>

设计解说:

  1. 我们将整个 tr 包在 tbody 之中,好让 $( ".sortable" ).sortable 将 tbody 标籤内的 tr 都变成可以拖拉,而不会拖拉到标题列 thead 中的 tr。
  2. 因为每个活动的 reorder 网址都不同,所以我们将网址放在 data-reorder-url="<%= reorder_admin_event_path(event) %> 之中,这样在 jQuery 里面透过 reorder_url = ui.item.data('reorder-url') 就可以取得 Ajax 要送去的网址。

编辑 app/controllers/admin/events_controller.rb

app/controllers/admin/events_controller.rb

  def reorder
@event = Event.find_by_friendly_id!(params[:id])
@event.row_order_position = params[:position]
@event.save! - redirect_to admin_events_path
+ respond_to do |format|
+ format.html { redirect_to admin_events_path }
+ format.json { render :json => { :message => "ok" }}
+ end
end

拖拉记录上下移动--Ajax UI的更多相关文章

  1. UWP学习记录11-设计和UI

    UWP学习记录11-设计和UI 1.输入和设备 通用 Windows 平台 (UWP) 中的用户交互组合了输入和输出源(例如鼠标.键盘.笔.触摸.触摸板.语音.Cortana.控制器.手势.注视等)以 ...

  2. UWP学习记录10-设计和UI之控件和模式7

    UWP学习记录10-设计和UI之控件和模式7 1.导航控件 Hub,中心控件,利用它你可以将应用内容整理到不同但又相关的区域或类别中. 中心的各个区域可按首选顺序遍历,并且可用作更具体体验的起始点. ...

  3. UWP学习记录9-设计和UI之控件和模式6

    UWP学习记录9-设计和UI之控件和模式6 1.图形和墨迹 InkCanvas是接收和显示墨迹笔划的控件,是新增的比较复杂的控件,这里先不深入. 而形状(Shape)则是可以显示的各种保留模式图形对象 ...

  4. UWP学习记录8-设计和UI之控件和模式5

    UWP学习记录8-设计和UI之控件和模式5 1.日历.日期和时间控件 日期和时间控件提供了标准的本地化方法,可供用户在应用中查看并设置日期和时间值. 有四个日期和时间控件可供选择,选择的依据如下: 日 ...

  5. UWP学习记录7-设计和UI之控件和模式4

    UWP学习记录7-设计和UI之控件和模式4 1.翻转视图 使用翻转视图浏览集合中的图像或其他项目(例如相册中的照片或产品详细信息页中的项目),一次显示一个项目. 对于触摸设备,轻扫某个项将在整个集合中 ...

  6. UWP学习记录6-设计和UI之控件和模式3

    UWP学习记录6-设计和UI之控件和模式3 1.按钮 按钮,响应用户输入和引发 Click 事件的控件. 使用<Button>就能创建一个按钮控件了.按钮是 ContentControl, ...

  7. UWP学习记录5-设计和UI之控件和模式2

    UWP学习记录5-设计和UI之控件和模式2 1.应用栏和命令栏 CommandBar 控件是一款通用.灵活.轻型的控件,可显示复杂内容(如图像或文本块)以及简单的命令(如 AppBarButton.A ...

  8. UWP学习记录4-设计和UI之控件和模式1

    UWP学习记录4-设计和UI之控件和模式1 1.控件和事件简介 在 UWP 应用开发中,控件是一种显示内容或支持交互的 UI 元素. 控件是用户界面的构建基块. 我们提供了超过 45 种控件供你使用, ...

  9. UWP学习记录3-设计和UI之样式

    UWP学习记录3-设计和UI之样式 1.颜色 在系统的“设置”>“个性化”>“颜色”里,提供了主题色选择.选定主题色后,会根据颜色亮度的 HSB 值创建浅色和深色的主题色. 应用可使用阴影 ...

随机推荐

  1. Flum入门必备知识

    1.flume概念 flume是分布式的,可靠的,高可用的,用于对不同来源的大量的日志数据进行有效收集.聚集和移动,并以集中式的数据存储的系统. flume目前是apache的一个顶级项目. flum ...

  2. Tomcat 系统架构

    https://www.ibm.com/developerworks/cn/java/j-lo-tomcat1/index.html 2010 年 5 月 20 日发布 本文以 Tomcat 5 为基 ...

  3. python设置redis过期时间

    import time import redis if __name__ == "__main__": try: conn=redis.StrictRedis(host='192. ...

  4. UEM用户行为了如指掌!

    “千呼万唤始出来”,万众期待的UEM正式与宝宝们见面啦~~~ 今天很多人来问小编,Web咋不见了,表急,Web并没有消失,而是重磅升级为UEM啦!!! 什么是UEM呢?UEM全称User Experi ...

  5. 洛谷P1858 多人背包 多人背包板子题/多人背包学习笔记

    ,,,本来自以为,我dp学得还挺好的 然后今天一考发现都不会啊QAQ 连最基础的知识点都不清楚啊QAQ 所以就来写个题解嘛! 先放下板子题 其实我jio得,这题只要大概了解方法就不是很难鸭,,,毕竟是 ...

  6. JDK安装(linux系统)

    安装好centos6.8以后,输入命令: 如果显示如下: 证明系统自带了JDK,需要手动删除. 然后搜索: 备注: 查询一个包是否被安装 # rpm -q < rpm package name& ...

  7. mysql 约束条件 auto_increment 自动增长目录

    mysql 约束条件 auto_increment 自动增长 mysql 约束条件 auto_increment 自动增长起始值 布长 起始偏移量 mysql 约束条件 auto_increment ...

  8. mysql性能测试--sysbench实践

    mysql性能测试--sysbench实践 Sysbench   业界较为出名的性能测试工具 可以测试磁盘,CPU,数据库 支持多种数据库:oracle,DB2,MYSQL 需要自己下载编译安装 建议 ...

  9. C语言中exit函数的使用

      exit() 结束当前进程/当前程序/,在整个程序中,只要调用 exit ,就结束 return() 是当前函数返回,当然如果是在主函数main, 自然也就结束当前进程了,如果不是,那就是退回上一 ...

  10. cocos代码研究(24)Widget子类PageView学习笔记

    理论基础 PageView类又称Layout的管理器,可以让用户在多个Layout之间左右或者上下切换显示,继承自 Layout . 代码实践 static PageView * create ()创 ...