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

Posted

技术标签:

【中文标题】如何使用 Select2 和远程数据禁用某些选项【英文标题】:How can I disable certain options with Select2 and remote data 【发布时间】:2013-08-16 08:02:42 【问题描述】:

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

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

谢谢!

【问题讨论】:

【参考方案1】:

在 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 属性,格式与第一个示例相同。

【讨论】:

明天第一件事就试试这个!天哪,如果这真的有效,我简直不敢相信它是如此简单。我可以问一个问题:你怎么知道添加这个“禁用”属性?您是在文档中找到的,还是有根据的猜测? @Moeri 没问题。 =] 我时不时地为 Select2 项目做出贡献,因此我对它的源代码相当熟悉 - 很容易找到它检查禁用属性的位置 (here)。但你是对的,这个选项有点隐藏,我会在今天晚些时候发送 PR 来更新文档。 :P 好的,谢谢!我还不能奖励我的赏金(还剩 2 小时),而且我住的地方已经很晚了,所以你明天也应该得到第一件事。感谢您的回答!虽然它真的很简单,但我喜欢你写出整个例子的方式。你肯定赢得了赏金。 :-) 好了,别着急,晚安。 =]我已经通过您的 GH 问题联系了 Igor,一旦我设法正确记录它,我将发送一个文档更新拉取请求。 顺便说一句,我已经创建了PR 来记录这一点,但还没有回复。【参考方案2】:

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 ;
      
    
  );

【讨论】:

以上是关于如何使用 Select2 和远程数据禁用某些选项的主要内容,如果未能解决你的问题,请参考以下文章

使用 select2 4.0.3 创建下拉数组并禁用基于其他 select2 值的选项

Yii2:如何禁用或只读 Select2 小部件?

如何在 select2 类型提前搜索中设置选项值以及如何从 ajax 数据添加选项组

带有远程数据的 select2 多选中的默认选择选项

Select2 禁用/启用特定选项

Select2:禁用选定的选项值不起作用