我一直在努力让 SortableJS 处理带有 todo 的多个列表并序列化 id。类似于 jQuery Sortable 序列化方法的工作方式。
每个列表中的待办事项总是从 1 开始,并随着待办事项的添加而增加,并随着待办事项的删除而减少。
例如:
待办事项清单一有三个待办事项
- 待办事项 5,位置:1
- 待办事项 1,位置:2
- 待办事项 9,位置:3
待办事项清单二有五个待办事项
- 待办事项 5,位置:1
- 待办事项 1,位置:2
- 待办事项 9,位置:3
- 待办事项 17,位置:4
- 待办事项 2,位置:5
我已经让 sortableJS 与stimulusJS 一起工作。一旦添加了任何其他列表,待办事项继续被视为它们都属于一个列表,因此如果有 8 个待办事项(列表 1 中的 3 个待办事项和列表 2 中的 5 个待办事项),则相应的位置将是 1-8 和不是 1-3 和 1-5。
这是我当前的配置:
drag_controller.js
import {Controller} from "stimulus"
import Sortable from "sortablejs"
export default class extends Controller {
connect() {
this.sortable = Sortable.create(this.element, {
animation: 150,
// handle: '.fa-grip-vertical',
onEnd: this.end.bind(this)
})
}
end(event) {
let id = event.item.dataset.id
let data = new FormData()
data.append('position', event.newIndex + 1)
Rails.ajax({
url: this.data.get("url").replace(":id", id),
type: 'PATCH',
data: data
})
}
}
todos_controller.rb
def sort
authorize(:todo, :sort?)
@todo.insert_at(params[:position].to_i)
head(:ok)
end
_todo_list.html.erb
<div data-controller="drag" class="list-group list-group-flush" data-drag-url="/todos/:id/sort">
<% todo_list.todos.order(complete: :asc, position: :asc).each do |todo| %>
<%= content_tag :div, class: 'list-group-item list-group-item-action', "data-id": todo.id do %>
<!-- iterated todos -->
...
<% end %>
<% end %>
</div>
将需要自定义排序路线作为采用序列化数据的集合。
排序操作将执行以下操作:
def sort
params[:todo].each_with_index do |id, index|
Todo.where(id: id).update_all(position: index + 1)
end
head(:ok)
end
我知道使用该toArray()
方法 ie this.sortable.toArray()
,它将为我提供列表中的 id 数组。我不确定如何在我的 drag_controller.js 和 SortableJS 中实现这一点。如何从 drag_controller.js 获取序列化数据到我的排序操作?