JQuery Tag-It - использование списка объектов с меткой value и label
Просто попробовал отличный Tag-It! плагин для jquery (http://aehlke.github.com/tag-it/), но я не могу заставить его работать так, как хотелось бы.
У меня есть список объектов, например:
var food = [{value:1,label:'Pizza'},{value:2,label:'Burger'},{value:3,label:'Salad'}];
Что я передаю в параметр tagSource в моей настройке:
$("#my_food_tags").tagit({
tagSource: food,
singleField: true,
singleFieldNode: $("#my_food"),
placeholderText: "Start typing a food name"
});
Это отлично работает, за исключением случаев, когда я нажимаю элемент автозаполнения списка, он отображает числовое значение в теге, а не название продукта.
Следовательно, возможно, что в значение "значение" введено скрытое поле, а "метка" - как имя тега?
Вот скриншот, что я имею в виду. Значение появляется в метке тега, и метка теряется в эфире; -)
![Example of label text being lost]()
Может ли кто-нибудь помочь мне здесь? Было бы очень благодарно!
Спасибо заранее,
Себ
Ответы
Ответ 1
Пробовал играть с ним, см.: http://jsfiddle.net/pDrzx/46/
Что я сделал:
Расширить функцию createTag с именем метки
createTag: function(labelname, value, additionalClass)
И вызвал его при создании метки var
var label = $(this.options.onTagClicked ? '<a class="tagit-label"></a>' : '<span class="tagit-label"></span>').text(labelname);
Затем я убедился, что скрытое поле ввода имеет числовое значение (для сохранения цели)
if (this.options.singleField) {
var tags = this.assignedTags();
tags.push(value);
this._updateSingleTagsField(tags);
} else {
var escapedValue = value;
tag.append('<input type="hidden" style="display:none;" value="' + escapedValue + '" name="' + this.options.itemName + '[' + this.options.fieldName + '][]" />');
}
И, наконец, я добавил имя метки в автозаполнение и сфокусировался
// Autocomplete.
if (this.options.availableTags || this.options.tagSource) {
this._tagInput.autocomplete({
source: this.options.tagSource,
select: function(event, ui) {
// Delete the last tag if we autocomplete something despite the input being empty
// This happens because the input blur event causes the tag to be created when
// the user clicks an autocomplete item.
// The only artifact of this is that while the user holds down the mouse button
// on the selected autocomplete item, a tag is shown with the pre-autocompleted text,
// and is changed to the autocompleted text upon mouseup.
if (that._tagInput.val() === '') {
that.removeTag(that._lastTag(), false);
}
that.createTag(ui.item.label,ui.item.value);
// Preventing the tag input to be updated with the chosen value.
return false;
},
focus: function(event, ui) {
event.preventDefault();
that.createTag(ui.item.label,ui.item.value);
}
});
Итак, что не хватает, вам нужно убедиться, что он передает имя метки во всех методах createTag, но это не должно быть слишком сложно:)
ОБНОВЛЕНО С ФОКУСОМ (ВДОХНОВЕННЫМ @Edwin)
Ответ 2
Самое легкое - получить плагин, который действительно поддерживает это. Это Select2 или Chosen.
Ответ 3
Самый простой способ решить эту проблему - изменить эту строку в теге - это источник Javascript:
that.createTag(ui.item.value);
к
that.createTag(ui.item.label);
Это часть раздела Autocomplete кода, начинающегося в строке 216 в моем редакторе:
// Autocomplete.
if (this.options.availableTags || this.options.tagSource) {
this._tagInput.autocomplete({
source: this.options.tagSource,
select: function(event, ui) {
// Lots of comments here
if (that._tagInput.val() === '') {
that.removeTag(that._lastTag(), false);
}
that.createTag(ui.item.value);
value.
return false;
}
});
}
Ответ 4
Внутри файла tag-it.js, где он комментировал//Автозаполнение, добавьте параметр фокуса событий, как показано ниже. Это должно исправить это.
// Autocomplete.
if (this.options.availableTags || this.options.tagSource || this.options.autocomplete.source) {
var autocompleteOptions = {
select: function(event, ui) {
that.createTag(ui.item.value);
// Preventing the tag input to be updated with the chosen value.
return false;
},
focus: function(event, ui) {
event.preventDefault();
that.tagInput.val(ui.item.label);
}
};
Ответ 5
Вот еще одно обходное решение (предполагая, что вы хотите использовать атрибут data-id):
var clone = $('#tags').clone();
// important to clone before calling tagit()
$('#tags').tagit({
beforeTagRemoved: function(event, ui) {
var item_id = clone.find('li:contains('+ui.tagLabel+')').data('id');
// do something with item_id / tag ui
}
});
Сопровождающий HTML:
<ul id="tags">
<li data-id="38">Item A</li>
<li data-id="19">Item B</li>
</ul>
Ответ 6
Переписывание события focus
для обработки как метки, так и значения не является простым. Мое решение состояло в использовании close
для создания тега с использованием сохраненной ссылки последнего ui.item
из события focus
:
$$("#search-widget-input")
.tagit(
{
placeholderText : 'Select or type a location, postcode or Web ID',
autocomplete : {
delay : 200,
minLength : 1,
search : function(event, ui) {
...
},
select: function(event, ui) {
// use the item label instead of value
$$("#search-widget-input").tagit("createTag", ui.item.label, '__value__' + ui.item.value);
return false; // prevents the tag input to auto tag the ui.item.value
},
focus: function(event,ui) {
// `focus` event does not fire `select` but does fires `close` event
// so we store our `ui.item` which allows us to reference it in `close` event
event.preventDefault();
self.oAutoCompleteSavedLastUiItem = ui.item;
},
close: function(event, ui) {
event.preventDefault();
$$("#search-widget-input").tagit("createTag", self.oAutoCompleteSavedLastUiItem.label, '__value__' + self.oAutoCompleteSavedLastUiItem.value);
return false; // prevents the tag input to auto tag the ui.item.value
},
source : function fAutocompleteSource(oRequest, fResponse) {
...
}
...
}
...
});
Ответ 7
Привет, я просто сделал это для своего проекта с PHP.
Я модифицировал плагины в какой-то момент, поэтому используйте script из раздела jsfiddle script.
Посмотрите здесь, я сделал полную рабочую пару ключевых значений script https://jsfiddle.net/656pnLsd/
<ul id="tag_list">
<li data-value="2">test2</li>
<ul>
<script>
var tag_sources = [{value:1,label:'test1'},{value:2,label:'test2'}];
console.log(tag_sources);
jQuery(document).ready(function() {
var eventTags = $('#tag_list');
eventTags.tagit({
availableTags: tag_sources,
fieldName: "bento4_tags",
singleField: true,
});
});
</script>
ОБНОВЛЕНО С ФОКУСОМ (ВДОХНОВЕНЫ @Эдвином и Марко Йоханнесеном)