jquery - 无法在 select2 中读取 null 的属性“concat”
问题描述
我正在尝试使用 select2 获取所有数据,包括父母和孩子的 tp 节目。我找到了一个有用的例子。当我尝试将“children”更改为“childPools”时,出现错误
未捕获的类型错误:无法读取 null 的属性“concat”
var FRUIT_GROUPS = [
{
id: '',
text: 'Citrus',
childPools: [
{ id: 'c1', text: 'Grapefruit' },
{ id: 'c2', text: 'Orange' },
{ id: 'c3', text: 'Lemon' },
{ id: 'c4', text: 'Lime' }
]
},
{
id: '',
text: 'Other',
childPools: [
{ id: 'o1', text: 'Apple' },
{ id: 'o2', text: 'Mango' },
{ id: 'o3', text: 'Banana' }
]
}
];
$('#fruitSelect').select2({
multiple: false,
placeholder: "Select fruits...",
data: FRUIT_GROUPS,
query: function (options) {
var selectedIds = options.element.select2('val');
var data = jQuery.extend(true, {}, FRUIT_GROUPS);
var selectableGroups = $.map(data, function (group) {
var areAllChildrenSelected = true,
parentMatchTerm = false,
anyChildMatchTerm = false;
if (group.text.toLowerCase().indexOf(options.term.toLowerCase()) >= 0) {
parentMatchTerm = true;
}
var i = group.childPools.length
while (i--) {
var child = group.childPools[i];
if (selectedIds.indexOf(child.id) < 0) {
areAllChildrenSelected = false;
};
if (options.term == '' || (child.text.toLowerCase().indexOf(options.term.toLowerCase()) >= 0)) {
anyChildMatchTerm = true;
}
else if (!parentMatchTerm) {
var index = group.childPools.indexOf(child);
if (index > -1) {
group.childPools.splice(index, 1);
};
};
};
return (!areAllChildrenSelected && (parentMatchTerm || anyChildMatchTerm)) ? group : null;
});
options.callback({ results: selectableGroups });
}
}).on('select2-selecting', function (e) {
var $select = $(this);
if (e.val == '') {
e.preventDefault();
$select.select2('data', $select.select2('data').concat(e.choice.childPools));
$select.select2('close');
}
});
我在将选择连接到select2('data')
.
$select.select2('data',$select.select2('data').concat(e.choice.children));
关于这个错误的任何想法?
解决方案
您在选择父项时遇到的错误是因为您禁用了多项选择,这使 data 属性保留为其默认值,即NULL
. 看看文档。它清楚地表明,当您启用多项选择时,数据属性需要一个对象数组。通过调用select2('data')
将返回一个表示当前选择的对象的 JavaScript 数组。
此外,您还使用了 childPools 而不是 API 文档不允许的 children。API 期望在传递给 Select2 方法的 JSON 中有以下要求。
何时在部分中生成选项
<optgroup>
;选项应该嵌套在children
每个组对象的键下。组的标签应指定为text
组对应数据对象的属性。Select2 要求每个对象都包含一个
id
和一个text
属性。与数据对象一起传递的其他参数将包含在data
Select2 公开的对象中。Select2 仅支持单层嵌套。任何额外的嵌套级别都不能保证在所有浏览器和设备上正确显示。
推荐阅读
- ruby-on-rails - Rspec:如何测试在私有方法中引发的异常?
- java - 将 Netbeans 预捆绑的库添加到 Fresh Maven 项目
- c# - 从网格视图标题中获取文本框值
- ios - 内容拥抱优先级的行为与自动布局不同
- javascript - 如何将值从 Ajax 传递到另一个函数
- sql-server - 查询执行需要更多时间
- node.js - PassportJS 对用户进行身份验证,但在后续请求中返回 401 Unauthorized
- plsql - 基于客户端的最佳分区机制
- python-3.x - 使用 FOR 循环生成 Wagtail 字段
- ios - 使用 Xib 时 UITableView 和 UICollectionView 的实现有什么区别?