jQuery tag-it允许仅使用来自自动完成源的标签

6

我正在尝试实现一个标签输入框,但我希望限制用户只能从自动完成框中选择值。我试图使用源json覆盖beforeTagAdded事件,并检查标签是否存在于源属性中,但没有成功。

以下是代码,请查看beforeTagAdded函数。

     $(document).ready(function () {
        var itemId;
        var theTags = $('#msg_to');
        theTags.tagit({
            autocomplete: {
                source: [{ id: "1", value: 'David'}, { id: "2", value: 'John' }],
                minLength: 0,
                select: function (event, ui) {
                    itemId = ui.item.id;
                    theTags.tagit("createTag", ui.item.value);
                }
            },
            showAutocompleteOnFocus: true,
            afterTagAdded: function (event, ui) {
                if (itemId) {
                    $(ui.tag).find('input').attr('name', "tag[\'" + itemId + "']['" + ui.tagLabel + "']");
                    itemId = null;
                }
            },
            beforeTagAdded: function (event, ui) {
                var id = ui.autocomplete.source; // not working

           // what to do next?
            }
        })
    });
</script>

提前感谢您的帮助。

4个回答

5

我的解决方案:

$(function() {     
   var currentlyValidTags = ['ac', 'dc'];
   $('input[name="_tags"]').tagit({
    availableTags: currentlyValidTags,
    autocomplete: { source: function( request, response ) {        
        var filter = removeDiacritics(request.term.toLowerCase());
        response( $.grep(currentlyValidTags, function(element) {
                        return (element.toLowerCase().indexOf(filter) === 0);
                    }));
    }},  
    beforeTagAdded: function(event, ui) {
      if ($.inArray(ui.tagLabel, currentlyValidTags) == -1) {
        return false;
      }
    }          
  });    
});

2
以下方法适用于我:
var currentlyValidTags = [];
$('#tags').tagit({
  autocomplete: {
    source: function(req, resp) {
      search(req, function(data) {
        currentlyValidTags = data;
        resp(data);
      });
    }
  },
  beforeTagAdded: function(event, ui) {
    if (!_.contains(currentlyValidTags, ui.tagLabel)) {
      return false;
    }
  }
});

上述解决方案适用于2.0版本的65d6fb4dad833bf490f2a7b27063ecd08f792ede(与标签v2.0上的2.0版本不同)。


1
有一个 tag-it 的分支可以满足您的要求:

https://github.com/chrisleishman/tag-it

它有一个requireAutocomplete设置。

(我不得不将两个版本合并,因为我需要每个版本的一些东西...但希望这能帮助你。)


谢谢大家,我发现使用select2更易于使用。 - Nir-Z

0
如果您正在寻找通过ajax实现自动完成的解决方案,这里有一个。
//this will be set true only if fetched via ajax and also selected from autocomplete
$.is_ajax_fetched = false; 

autocomplete 中,您需要这些事件:

select: function( event, ui ) {
$.is_ajax_fetched = true;
return true;
},

//select event will not work alone as tag-it captures event to check for comma and other stuff    
close: function( event, ui ) {
if($.is_ajax_fetched == true){
$('.ui-autocomplete-input').blur();
$('.ui-autocomplete-input').focus();
}
}

现在在tag-it调用中,您需要在选项中添加调用事件:

beforeTagAdded: function(event, ui) {
    if($.is_ajax_fetched != true){return false;}
},

afterTagAdded: function(event, ui) {
    $.is_ajax_fetched = false;
},

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接