如何使用Select2和远程数据禁用某些选项

时间:2013-08-14 11:30:12

标签: javascript jquery html jquery-select2

Select2支持在<select>标记上初始化时禁用的选项,如this issue

中所述

但是,我找不到如何用远程数据实现相同的结果。 我需要使用自定义格式功能吗?如何阻止用户选择呢? 或者这是内置的?

谢谢!

2 个答案:

答案 0 :(得分:26)

在Select2 3.4.2中,您只需要向给定的结果对象添加disabled: true属性。带query函数的实际示例:

$('input').select2({
    query: function(query) {
        //do ajax call which retrieves the results array in this format:
        var data = {results: [
            { id: 1, text: 'disabled option', disabled: true },
            { id: 1, text: 'hi' }
        ]};
        //pass it to the query callback inside your Ajax callback:
        query.callback(data);
    }
});

Demo


使用ajax包装器可以完成同样的操作,它以与query函数相同的格式接受结果对象数组。

这是一个带有实际Ajax调用的演示(通过jsFiddle的JSON API):

$('input').select2({
    ajax: {
        url: '/echo/json/',
        dataType: 'json',
        params: {
            method: 'post'
        },
        data: function (term, page) {
            // Data to be sent to the server. Usually it is just the "term"
            // parameter (and page if using pagination).
            // However, since this API simply echoes back what we send,
            // I'll build the results array here
            var resultsArr = [];
            for (var i = 0; i < 10; i++) {
                resultsArr.push({
                    id: i,
                    text: 'opt'+i,
                    //randomly disable a couple options for demo purposes
                    disabled: Math.random() < .3
                });
            }
            return {
                json: JSON.stringify(resultsArr)
            }
        },
        results: function(data, page) {
            //data param === received response from the server. As dataType
            //is json, jQuery automatically parses the response into an object.
            //So, in this case, we received the resultsArr that we sent.
            //Now return it in the correct format: { results: resultsArr }
            return { results: data };
        }
    }
});

Demo

请记住,最后一个示例中的data函数只是为了正确使用jsFiddle API - 您应该保留发送查询字词的原始data函数。您所要做的就是修改响应,以便结果对象在您要禁用的结果中包含disabled: true属性,格式与第一个示例相同。

答案 1 :(得分:0)

select2不能更改服务器数据,但是可以更改选项 结果重新加载到页面之前

  $('.input-selector').select2({
  ajax: {
      url: function (params) {
        return '/to/url/resource.json';
      },
      processResults: function (data) {
        var data_modified = $.map(data.results, function (obj) {
          obj.disabled = true; // or use logical statement
          return obj;
        });

        return { results: data_modified };
      }
    }
  });