Я настраиваю Sortable вложенную форму в приложении Rails 4, немного изменяя учебник Railscast 147, и все работает отлично. В моем проекте каждый li
завершает fields_for
с полями для вложенного ресурса, включая флажок. Моя проблема заключается в том, что я хочу, чтобы обрабатывать информацию флажка в зависимости от положения флажка, содержащего li
. Кроме того, если один из входов проверяется, это также должно влиять на другие поля. Я написал функцию jquery для этого (в основном через addClass
и removeClass
), и я removeClass
эту функцию в свой сортируемый и обработчик события.
process_components = (o) ->
$components = $(o).find('li')
// other stuff
$components.removeClass("parent_component child_component")
$components.find('input.is_child').each ->
firstcheck = $(this).prop('checked')
secondcheck = $(this).closest('li').next().find('input.is_child').prop('checked')
if firstcheck is true
$(this).closest('li').addClass('child_component')
if firstcheck is false and secondcheck is true
$(this).closest('li').addClass('parent_component')
$('#components-list').sortable
axis: 'y'
items: "> li.component"
update: ->
$.post($(this).data('update-url'), $(this).sortable('serialize'))
process_components $(this)
$('#components-list').on 'click', ':checkbox', (event) ->
process_components '#components-list'
Моя проблема в том, что это работает правильно только после ручной сортировки элементов списка несколько раз (элементы становятся реагировать на состояние флажка только после того, как изменилась их позиция в списке). Я осмотрелся здесь и в Google, но я не мог понять, почему это происходит. Может ли это иметь какое-то отношение к различиям между JQuery и JQuery UI при обработке addClass
? Есть какие нибудь идеи как это починить? благодаря
После того, как я понял, на самом деле fields_for
были виновниками. Я понятия не имею, почему это происходит, но, проверяя различные элементы на отображаемой странице, я обнаружил, что поле hidden :id
которое генерируется Rails, НЕ помещается как дочерний элемент li
содержащий все остальные поля компонента. Вместо этого поле hidden :id
изначально появляется как родной брат li
содержащий его, и поэтому process_components
нацеливается на неправильный элемент в DOM. После перетаскивания разных li
в сортируемом, создается правильная структура DOM, и все работает. Таким образом, решение этого вопроса должно переопределить значения по умолчанию для Rails, указав f.fields_for(:components, include_id: false)
и явно включив <%= f.hidden_field :id %>
в поля fields_for
. Таким образом, все работает, когда страница загружается.
process_components
при загрузке страницы? До сих пор не ясно, в чем проблема, хотя