Vue js добавляет динамические поля в список с удалением и сортировкой не работает
Я использую Vue js 1.0.25
.
Я хочу создать list
с помощью dynamic textboxes
. Основная идея заключается в нажатии кнопки Добавить ответ, она должна создать dynamic text-box
вместе со своим номером index
, например Ans 1, а с помощью Удалить кнопка.
Пользователь может добавить максимум 5 ответов. А также пользователь может re-order
ответить, используя метку Ответ в качестве обработчика. Я использую jQuery Sortable
как Vue directive
для сортировки ответов.
Кажется, все хорошо, здесь я создал JSFiddle для него: https://jsfiddle.net/devendragohil/6stotpaq/23/
Но проблема возникает при удалении ответа после его переупорядочения. Предположим, добавьте пять ответов, а затем производите их случайным образом и после которые пытаются удалить их один за другим, он будет вести себя странно.
Как я могу это исправить?
Ответы
Ответ 1
Я не знаю, где вы выдаете, но я думаю, что это связано с jQuery Sortable
. Я реплицирую ваш пример, используя vue-sortable, и он работает довольно Что ж.
Документы просты, короче, вам нужно добавить v-sortable
в свой контейнер списка, и все остальное должно работать так, как у вас есть.
ИЗМЕНИТЬ
Как @g.annunziata упоминает об этом в своем комментарии, предыдущий пример не работает, если вы заказываете, а затем добавляете новый элемент.
Чтобы решить эту проблему, нам нужно также обновить массив данных, добавьте эти параметры в директиву v-sortable="{onUpdate: onUpdate }"
и добавьте этот метод в vm
onUpdate: function (event) {
var movingElement = this.answers.splice(event.oldIndex, 1)[0];
this.answers.splice(event.newIndex, 0, movingElement);
}
Пока я пытался исправить это, я получил еще одну проблему, если я переместил один элемент в последнюю позицию, а затем добавлю новый элемент, я получаю эту уродливую ошибку
![Невозможно прочитать свойство parentNode 'null]()
Я не вникал в настоящую причину этого, но, как обходной путь, просто добавьте невидимый список элементов div
after, что-то вроде этого.
<div class="list-group" v-sortable="{ handle:'.handle', onUpdate: onUpdate }">
<div class="list-group-item" v-for="answer in answers">
...
</div>
<div style="display:none"></div>
</div>
Пример исправлен, см. http://jsbin.com/qinofow/edit?html,js,output
Ответ 2
Проблема заключается в том, как вы пытаетесь удалить элемент, эта строка здесь:
self.answerList.$remove(answer);
Это казалось хорошим местом, чтобы просто удалить выбранный элемент из массива, используя его индекс, и vuejs позволяет нам получить его при легко итерации.
Взгляните на рабочую скрипку здесь: https://jsfiddle.net/therealchiko/u9mjt5hd/2/, я изменил функцию, которая удаляет окно и обновляет параметры для цикла.
Ответ 3
Похоже, что когда пользовательский интерфейс обновляется при переупорядочении списка, массив не изменяется. Вы должны изменить его при изменении порядка.