web-dev-qa-db-ja.com

select2でAJAXを使用したタグ付け

select2 でタグ付けをしています

Select2には次の要件があります。

  1. Select2 ajaxを使用していくつかのタグを検索する必要があります
  2. また、リストにない値を許可するselect2で「タグ」を使用する必要があります(Ajax結果)。

両方のシナリオは独立して動作します。ただし、一緒に結合されたaJax値にはデータが入力されるだけです。リストにない他の値を入力すると、「一致が見つかりません」と表示されます

私のシナリオユーザーがリストにない新しい値を入力した場合、ユーザーが独自のタグを作成できるようにします。

これを機能させる方法はありますか?

70
Sri

Select2には、関数「createSearchChoice」があります。

ユーザーの検索語から新しい選択可能な選択肢を作成します。クエリ機能を介して利用できない選択肢を作成できます。 「タグ付け」ユースケースなど、ユーザーがその場で選択肢を作成できる場合に役立ちます。

以下を使用することにより、目的を達成できます。

createSearchChoice:function(term, data) {
  if ($(data).filter(function() {
    return this.text.localeCompare(term)===0;
  }).length===0) {
    return {id:term, text:term};
  }
},
multiple: true

JSONの結果をajax検索に返し、用語が結果を返さなかった場合に用語からタグを作成できるようにする、より完全な回答を次に示します。

$(".select2").select2({
  tags: true,
  tokenSeparators: [",", " "],
  createSearchChoice: function(term, data) {
    if ($(data).filter(function() {
      return this.text.localeCompare(term) === 0;
    }).length === 0) {
      return {
        id: term,
        text: term
      };
    }
  },
  multiple: true,
  ajax: {
    url: '/path/to/results.json',
    dataType: "json",
    data: function(term, page) {
      return {
        q: term
      };
    },
    results: function(data, page) {
      return {
        results: data
      };
    }
  }
});
97
Chris Edwards

V4を選択

http://jsfiddle.net/8qL47c1x/2/

HTML:

<select multiple="multiple" class="form-control" id="tags" style="width: 400px;">
    <option value="tag1">tag1</option>
    <option value="tag2">tag2</option>
</select>

JavaScript:

$('#tags').select2({
    tags: true,
    tokenSeparators: [','],
    ajax: {
        url: 'https://api.myjson.com/bins/444cr',
        dataType: 'json',
        processResults: function(data) {
          return {
            results: data
          }
        }
    },

    // Some Nice improvements:

    // max tags is 3
    maximumSelectionLength: 3,

    // add "(new tag)" for new tags
    createTag: function (params) {
      var term = $.trim(params.term);

      if (term === '') {
        return null;
      }

      return {
        id: term,
        text: term + ' (new tag)'
      };
    },
});

V3.5.2を選択

改善された例:

http://jsfiddle.net/X6V2s/66/

html:

<input type="hidden" id="tags" value="tag1,tag2" style="width: 400px;">

js:

$('#tags').select2({
    tags: true,
    tokenSeparators: [','],
    createSearchChoice: function (term) {
        return {
            id: $.trim(term),
            text: $.trim(term) + ' (new tag)'
        };
    },
    ajax: {
        url: 'https://api.myjson.com/bins/444cr',
        dataType: 'json',
        data: function(term, page) {
            return {
                q: term
            };
        },
        results: function(data, page) {
            return {
                results: data
            };
        }
    },

    // Take default tags from the input value
    initSelection: function (element, callback) {
        var data = [];

        function splitVal(string, separator) {
            var val, i, l;
            if (string === null || string.length < 1) return [];
            val = string.split(separator);
            for (i = 0, l = val.length; i < l; i = i + 1) val[i] = $.trim(val[i]);
            return val;
        }

        $(splitVal(element.val(), ",")).each(function () {
            data.Push({
                id: this,
                text: this
            });
        });

        callback(data);
    },

    // Some Nice improvements:

    // max tags is 3
    maximumSelectionSize: 3,

    // override message for max tags
    formatSelectionTooBig: function (limit) {
        return "Max tags is only " + limit;
    }
});

JSON:

[
  {
    "id": "tag1",
    "text": "tag1"
  },
  {
    "id": "tag2",
    "text": "tag2"
  },
  {
    "id": "tag3",
    "text": "tag3"
  },
  {
    "id": "tag4",
    "text": "tag4"
  }
]

2015-01-22に更新:

Jsfiddleを修正: http://jsfiddle.net/X6V2s/66/

更新日2015-09-09:

Select2 v4.0.0 +では、より簡単になりました。

V4.0.0を選択

https://jsfiddle.net/59Lbxvyc/

HTML:

<select class="tags-select" multiple="multiple" style="width: 300px;">
  <option value="tag1" selected="selected">tag1</option>
  <option value="tag2" selected="selected">tag2</option>
</select>

JS:

$(".tags-select").select2({
  // enable tagging
  tags: true,

  // loading remote data
  // see https://select2.github.io/options.html#ajax
  ajax: {
    url: "https://api.myjson.com/bins/444cr",
    processResults: function (data, page) {
      return {
        results: data
      };
    }
  }
});
34
createSearchChoice : function (term) { return {id: term, text: term}; }

このオプション項目を追加するだけです

5
chuck911

結果リストの最初の結果としてajax関数が検索語を返すようにすることで、この作業を行うことができます。ユーザーはその結果をタグとして選択できます。

0
Tor