我有一个运行在this jsfiddle的工作版本.
但是,例如,如果仅返回1个搜索结果,我想跳过整个选择过程,并将返回的搜索结果添加到所选选项的列表中.根据select2 docs我可以添加一个这样的新选项:
option = new Option("Sample text","123",true,true); select2_element.append(option); select2_element.trigger('change');
这似乎在某种程度上起作用.但有一些问题.
>添加选项后,我无法清除搜索字段.
>我不能添加任何其他id和文本.
>添加的选项将显示给用户未定义.
我意识到这个问题包含3个方面,但是所有3个方面都可能回溯到这个1个问题:
如何以编程方式添加新的jquery-select2-4选项并重置搜索字段?
为了您的参考,这是我问的代码的上下文:
var formatRepo,formatRepoSelection,selectRepos; formatRepoSelection = function(element) { return element.name + ' ' + element.forks + ' ' + element.id; }; formatRepo = function(element) { var markup; if (!element.loading) { return markup = element.name + ' ' + element.id; } }; selectRepos = function() { var option,select2_element; select2_element = $('#select2_element'); select2_element.select2({ ajax: { url: "https://api.github.com/search/repositories",dataType: 'json',data: function (params) { return { q: params.term,page: params.page }; },processResults: function (data,params) { if (data.items.length === 1) { // START: The code I am asking about. // Add the search result directly as an option. option = new Option("Sample text",true); select2_element.append(option); return select2_element.trigger('change'); // END: The code I am asking about. } else { params.page = params.page || 1; return { results: data.items,pagination: { more: (params.page * 30) < data.total_count } }; } },cache: true },escapeMarkup: function(markup) { return markup; },templateResult: formatRepo,templateSelection: formatRepoSelection }); }; $(function() { return selectRepos(); });
解决方法
1.模拟唯一剩余物品的选择
如您所说,创建一个选项元素有其局限性:您只能指定id和text属性,不需要访问所选项的其他属性.
此外,它会生成未定义的值.这是因为回调函数formatRepoSelection尝试访问为该选项元素创建的对象未定义的属性(名称和叉).您可以尝试解决这个问题,并在这种情况下使用text属性,但是您仍然无法解决上述限制.
我在这里提出的解决方案有不同的做法.而不是直接创建标签,您可以模拟用户对最后一个项目的选择,将mouseup事件发送到该列表项.
这具有如同用户点击了该项目一样应用正常选择行为的直接优点,因此可立即解决所有三个问题:
>自动清除过滤器文本;
> formatRepoSelection函数接收通常的对象,因此标签的标签符合预期;
>与任何项目相同的属性可用于您.
这是代码实现:
if (data.items.length === 1) { // Change 1: // Allow the list to update setTimeout(function() { // ... and then send a click event to the first list item // Note the used id has the SELECT id in the middle. $("#select2-select2_element-results li:first-child").trigger('mouseup'); },0);
这个解决方案的缺点是你让自己依赖实现方面;未来版本的select2可能会根据HTML元素和属性组织结果不同.
但是,当您决定使用更新版本的select2时,更新代码不应该是一件大事.
2.返回正确的对象
TypeError: b is undefined,at select2.min.js:2:9842
这是因为这个说法:
return select2_element.trigger('change');
这返回jQuery select2_element对象,但是库期望返回值具有结果属性.
由于触发器不再需要,因此可以通过以下方法来替换:
// Change 2: // Return empty results array return { results: data.items };
不要试图设置结果:[],因为我们仍然需要该项目来模拟鼠标事件.
那就是这一切.