Изменение X редактируемых шаблонов для каждого элемента (не глобально)

#javascript #jquery #twitter-bootstrap-3 #x-editable

#javascript #jquery #twitter-bootstrap-3 #x-редактируемый

Вопрос:

Я добавил кнопку удаления в редактируемую форму X, используя следующий скрипт (живая демонстрация).

Как это может быть достигнуто только для некоторых элементов (т.Е. .editable-with-delete ), а не глобально?

введите описание изображения здесь

 $('.editable').editable();

$.fn.editableform.buttons  = '<button type="button" class="btn btn-default btn-sm editable-delete"><i class="glyphicon glyphicon-trash"></i></button>';

$('.editable-with-delete').editable();


$("#list").on("click", "i.glyphicon-trash", function() {
  console.log('delete')
});

<h4>X-editable: display checklist as UL</h4>
<ul id='list'>
  <li class='editable-with-delete'>Editable element with delete</li>
  <li class='editable'>Editable element without delete</li>
  <li class='editable'>Editable element without delete</li>
</ul>
 

Ответ №1:

С функциями, предлагаемыми в настоящее время библиотекой X-editable, я не вижу способа сделать то, что вы хотите, просто установив параметры для ваших редактируемых файлов.

Однако вы можете сделать это, прослушав shown событие и добавив кнопку в обработчик событий. Вот пример:

 $('.editable').editable();

$(".editable-with-delete")
  .on("shown", function(ev, editable) {
    const buttons = editable.container.$form.find(".editable-buttons")[0];
    buttons.insertAdjacentHTML("beforeend", '<button type="button" class="btn btn-default btn-sm editable-delete"><i class="glyphicon glyphicon-trash"></i></button>')
  })
  .editable();

$("#list").on("click", ".editable-delete", function() {
  console.log('delete')
});
 

В идеале, в моих собственных приложениях я бы предпочел, чтобы кнопки добавлялись до отображения всплывающего окна, но я не вижу способа сделать это с помощью общедоступного API библиотеки в том виде, в каком она существует сейчас. Во всяком случае, с учетом оптимизации перепрошивки, выполняемой браузерами в наши дни, я сомневаюсь, что добавление кнопки в shown обработчик заметно влияет на пользовательский интерфейс.

Вот измененная скрипка: https://jsfiddle.net/kuqjtdar/3 /

Комментарии:

1. Спасибо, Луи! Если у меня есть что-то еще, привязанное к тому же элементу (в частности github.com/sindu12jun/table-dragger ), есть ли опасения по поводу использования shown ? Может shown ли обратный вызов относиться только к editable ? Если нет, я полагаю, я всегда могу обернуть вокруг него какой-нибудь другой элемент.

2. Кроме того, какие-либо рекомендации о том, как добавить обратный вызов? Мой $("#list").on("click", ".editable-delete", function() {}); подход не идеален, и я думаю, что его, вероятно, следует добавить shown , не так ли?

3. Игнорируйте второй комментарий. Я просто добавлю buttons.children.item(2).addEventListener("click", function(){console.log('delete')})

4. Спасибо за щедрость. Что касается shown события, можно столкнуться с конфликтом, если вы измените всплывающее окно, созданное x-editable, чтобы оно содержало другие вещи, которые генерируют shown события. Если это вызывает беспокойство, вы могли бы добавить if (ev.target !== this) return; , что касается обработки нажатия на кнопку удаления, выполнение этого так, как оно есть в ответе, по сути, не является проблематичным. Обработчик событий создается до создания каких-либо кнопок, но поскольку код использует делегирование событий, это не проблема. В конечном счете, наилучший подход действительно зависит от общей структуры вашего приложения.

Ответ №2:

Не самое элегантное решение, но вы можете добавить кнопку удаления, используя отдельное событие щелчка, и сбросить html, когда удаление не требуется. Смотрите фрагмент кода ниже.

 $('#list').editable();

$('#list').on('click', '.editable',  ()=> resetButtons());

$('#list').on('click', '.editable-with-delete', ()=> { 
resetButtons();
$.fn.editableform.buttons  = '<button type="button" class="btn btn-default btn-sm editable-delete"><i class="glyphicon glyphicon-trash"></i></button>';
});

function resetButtons() {
$.fn.editableform.buttons = '<button type="submit" class="btn btn-primary btn-sm editable-submit"><i class="glyphicon glyphicon-ok"></i></button><button type="button" class="btn btn-default btn-sm editable-cancel"><i class="glyphicon glyphicon-remove"></i></button>';
}


 

Комментарии:

1. Спасибо, Гай-Кертис, при попытке вашего решения форма не обновляется до тех пор, пока не будет нажат элемент во второй раз. Немного отличается, но должно быть таким же: jsfiddle.net/opdsvkxe . Вы пробовали это, и если да, получили ли вы разные результаты? Спасибо