Rubaxa-Sortable Не удалось выполнить "совпадения" для "элемента": ">*" не является допустимым селектором

Я использую библиотеку vuejs и Rubaxa Sortable JavaScript. Сортируемый работает нормально с <ul><li> но с таблицами строк это выдает эту ошибку, когда я переставляю с помощью перетаскивания.

Sortable.min.js:3 Uncaught DOMException: Failed to execute 'matches' on 'Element': '>*' is not a valid selector.

Я использую Vue.js v2.5.13 и Rubaxa Sortable v1.7.0.

Vue.directive('sortable', {
  inserted: function (el, binding) {
    var sortable = new Sortable(el, binding.value || {});
  }
});
new Vue({
  el: '#app',
  data () {
    return {
      items: [{id: 1},{id: 2},{id: 3},{id: 4},{id: 5}]
    }
  },
  methods: {
    reorder ({oldIndex, newIndex}) {
      const movedItem = this.items.splice(oldIndex, 1)[0]
      this.items.splice(newIndex, 0, movedItem)
    }
  }
})
<script src="https://vuejs.org/js/vue.min.js"></script>
<script src="https://cdn.rawgit.com/RubaXa/Sortable/c35043730c22ec173bac595346eb173851aece20/Sortable.min.js"></script>
<div id="app">
  <h2>With List</h2>
  <ul v-sortable="{onEnd: reorder}">
    <li v-for="i in items" :key="i.id">{{ i.id }}</li>
  </ul>

  <hr/>

  <h2>With Table</h2>
  <table v-sortable="{onEnd: reorder}">
    <tr v-for="i in items" :key="i.id">
      <td>{{ i.id }}</td>
    </tr>
  </table>

  {{ items }}

</div>

1 ответ

Решение

<table> не может содержать строки таблицы (<tr>). Структура таблицы такова.

<table>
   <thead></thead>
   <tbody></tbody>
   <tfoot></tfoot>
</table>

Поэтому, когда мы пишем HTML-таблицу, как это,

<table>
   <tr>First Row</tr>
   <tr>Second Row</tr>
</table>

Браузер автоматически вставляет все строки внутри <tbody> и делает это так

<table>
   <tbody>
      <tr>First Row</tr>
      <tr>Second Row</tr>
   </tbody>
</table>

Таким образом, строки таблицы не являются прямым потомком <table> скорее они дети <tbody>, Так что сгенерируйте строки вашей таблицы внутри <tbody> и добавить v-sortable к этому <tbody>,

<table>
   <tbody v-sortable="{onEnd: reorder}">  <!-- v-sortable here -->
      <tr v-for="i in items" :key="i.id">
         <td>{{ i.id }}</td>
      </tr>
   </tbody>
</table>

И минимизированная версия Sortable имеет ошибку, они как-то избавились от try-catch блокировать, когда минимизируется это вызывает его сбой, когда что-либо кроме <ul><li> отсортировано Так что, пока они это не исправят, воспользуйтесь разработкой, т.е. несжатой версией Sortable.

Другие вопросы по тегам