在 ExtJS 标记字段中选择值后,输入字段不会被清除
Input field doesn't get cleared after choosing the value in the ExtJS tag field
我有 ExtJS 标记字段,其中 anyMatch = true。现在,如果您键入 AB,它将显示结果,一旦您选择了选择,它将清除您输入的输入,即 AB 现在当您有anyMatch= true 那个时候如果我输入 HI 它会显示结果但是当你选择值时输入字段不会被清除。我看到在 clearInput 方法中明确处理的 ExtJS 标记字段代码。我想知道为什么要以这种方式实施?
下面是示例代码
Ext.create('Ext.form.Panel', {
title: 'Tag Field Example',
width: 1000,
bodyPadding: 10,
items: [{
xtype: 'fieldcontainer',
labelWidth: 100,
layout: 'hbox',
items: [{
xtype: 'fieldcontainer',
defaults: {
flex: 1,
},
layout: 'hbox',
items: [{
xtype: 'tagfield',
minChars: 1,
anyMatch: true,
allowBlank: true,
margin: '5 5 5 5',
fieldLabel: 'Tag Field 1',
name: 'tagField1',
store: ['ABC D', 'EFG HI', 'C'],
queryMode: 'local',
filterPickList: true,
emptyText: 'Multi Select...'
}]
}]
}],
renderTo: Ext.getBody()
});
这似乎是一个错误。如果您查看 tagfield class definition 中的 clearInput
方法,特别是早期的 return:
部分
if (!Ext.String.startsWith(lastDisplayValue, inputValue, true)) {
return;
}
您可以看到,如果最后选择的标签字段值不是以键入的输入值开头('abc d' 以 'ab' 开头,因此字段被清除;'efg hi' 不以 'hi' 开头 - 因此清除被丢弃)。
当您启用 anyMatch 配置时,这显然不起作用。
上面的早期 return 部分应该是这样的:
if (!me.anyMatch) {
if (!Ext.String.startsWith(lastDisplayValue, inputValue, true)) {
return;
}
} else {
if (lastDisplayValue.toLowerCase().indexOf(inputValue.toLowerCase()) === -1) {
return;
}
}
我们在 anyMatch
未启用时保留初始检查,否则,我们检查输入的输入值 是否包含 在最后选择的标签字段值中。
这里是一个fiddle建议的覆盖:https://fiddle.sencha.com/#view/editor&fiddle/32q0
我将数组用于多个字符串值(列表项:Lincoln Abraham,输入值:Abraham Lin)。
那种检查它是否正确匹配的方法。
在我的实现中,输入字符串的最后一部分用作通配符字符串。它还解决了列表项与输入字符串相反的问题,在我的例子中就是这样。
clearInput: function() {
var me = this,
valueRecords = me.getValueRecords(),
inputValue = me.inputEl && me.inputEl.dom.value,
lastDisplayValue;
if (valueRecords.length && inputValue) {
lastDisplayValue = valueRecords[valueRecords.length - 1].get(me.displayField);
let inputValueArr = inputValue.split(' ');
let lastDisplayValueArr = lastDisplayValue.split(' ');
let matchCount = 0;
Ext.each(inputValueArr, function(iv, idx1, arr1) {
Ext.each(lastDisplayValueArr, function(ldv, idx1, arr2) {
if (!me.anyMatch) {
if (Ext.String.startsWith(ldv, iv, true)) {
matchCount++;
}
} else {
if (ldv.toLowerCase().indexOf(iv.toLowerCase()) !== -1) {
matchCount++;
}
}
});
});
if (matchCount < inputValueArr.length) {
return;
}
me.inputEl.dom.value = '';
if (me.queryMode === 'local') {
me.clearLocalFilter();
// we need to refresh the picker after removing
// the local filter to display the updated data
me.getPicker().refresh();
}
}
}
我有 ExtJS 标记字段,其中 anyMatch = true。现在,如果您键入 AB,它将显示结果,一旦您选择了选择,它将清除您输入的输入,即 AB 现在当您有anyMatch= true 那个时候如果我输入 HI 它会显示结果但是当你选择值时输入字段不会被清除。我看到在 clearInput 方法中明确处理的 ExtJS 标记字段代码。我想知道为什么要以这种方式实施? 下面是示例代码
Ext.create('Ext.form.Panel', {
title: 'Tag Field Example',
width: 1000,
bodyPadding: 10,
items: [{
xtype: 'fieldcontainer',
labelWidth: 100,
layout: 'hbox',
items: [{
xtype: 'fieldcontainer',
defaults: {
flex: 1,
},
layout: 'hbox',
items: [{
xtype: 'tagfield',
minChars: 1,
anyMatch: true,
allowBlank: true,
margin: '5 5 5 5',
fieldLabel: 'Tag Field 1',
name: 'tagField1',
store: ['ABC D', 'EFG HI', 'C'],
queryMode: 'local',
filterPickList: true,
emptyText: 'Multi Select...'
}]
}]
}],
renderTo: Ext.getBody()
});
这似乎是一个错误。如果您查看 tagfield class definition 中的 clearInput
方法,特别是早期的 return:
if (!Ext.String.startsWith(lastDisplayValue, inputValue, true)) {
return;
}
您可以看到,如果最后选择的标签字段值不是以键入的输入值开头('abc d' 以 'ab' 开头,因此字段被清除;'efg hi' 不以 'hi' 开头 - 因此清除被丢弃)。
当您启用 anyMatch 配置时,这显然不起作用。
上面的早期 return 部分应该是这样的:
if (!me.anyMatch) {
if (!Ext.String.startsWith(lastDisplayValue, inputValue, true)) {
return;
}
} else {
if (lastDisplayValue.toLowerCase().indexOf(inputValue.toLowerCase()) === -1) {
return;
}
}
我们在 anyMatch
未启用时保留初始检查,否则,我们检查输入的输入值 是否包含 在最后选择的标签字段值中。
这里是一个fiddle建议的覆盖:https://fiddle.sencha.com/#view/editor&fiddle/32q0
我将数组用于多个字符串值(列表项:Lincoln Abraham,输入值:Abraham Lin)。
那种检查它是否正确匹配的方法。
在我的实现中,输入字符串的最后一部分用作通配符字符串。它还解决了列表项与输入字符串相反的问题,在我的例子中就是这样。
clearInput: function() {
var me = this,
valueRecords = me.getValueRecords(),
inputValue = me.inputEl && me.inputEl.dom.value,
lastDisplayValue;
if (valueRecords.length && inputValue) {
lastDisplayValue = valueRecords[valueRecords.length - 1].get(me.displayField);
let inputValueArr = inputValue.split(' ');
let lastDisplayValueArr = lastDisplayValue.split(' ');
let matchCount = 0;
Ext.each(inputValueArr, function(iv, idx1, arr1) {
Ext.each(lastDisplayValueArr, function(ldv, idx1, arr2) {
if (!me.anyMatch) {
if (Ext.String.startsWith(ldv, iv, true)) {
matchCount++;
}
} else {
if (ldv.toLowerCase().indexOf(iv.toLowerCase()) !== -1) {
matchCount++;
}
}
});
});
if (matchCount < inputValueArr.length) {
return;
}
me.inputEl.dom.value = '';
if (me.queryMode === 'local') {
me.clearLocalFilter();
// we need to refresh the picker after removing
// the local filter to display the updated data
me.getPicker().refresh();
}
}
}