我对允许绑定哪些配置值以及哪些配置值不允许而感到困惑。目前,不允许绑定allowBlank,因为我收到错误Ext.mixin.Bindable.applyBind(): Cannot bind allowBlank on Ext.form.field.ComboBox - missing a setAllowBlank method.
如果我使用配置,我没有收到错误,但它没有按预期工作:
xtype: 'combobox',
anchor: '100%',
fieldLabel: 'Affiliation',
name: 'AffiliationId',
displayField: 'Abbreviation',
valueField: 'AffiliationId',
queryMode: 'local',
typeAhead: true,
config: {
forceSelection: true,
allowBlank: false
},
bind: {
store: '{affiliationStore}',
allowBlank: '{allowBlankAffiliation}',
forceSelection: '{forceSelectionAffiliation}'
}
我想知道的是,如何将allowBlank
或任何其他属性绑定到公式?这甚至可能,还是我完全不了解某些事情?如果是这样,我怎么知道我能绑定什么以及我无法绑定什么?
答案 0 :(得分:5)
只有具有setter的属性,docs中应该存在set方法才能绑定。 ' setAllowBlank'不存在。 allowBlank
没有开箱即用的setter,因为它没有放在组合框对象的配置中。正如您在源代码中看到的那样:
http://docs.sencha.com/extjs/5.0/5.0.1-apidocs/source/Text.html#Ext-form-field-Text-cfg-allowBlank
通过像您一样将allowBlank
设置为配置,您只能抑制错误。
您可以做的是扩展ComboBox并创建自定义配置属性。之后,您可以覆盖更新方法(由配置系统创建)并手动设置allowBlank
。
Ext.define('MyComboBox', {
extend: 'Ext.form.field.ComboBox',
alias: 'widget.MyComboBox',
config: {
requireMe: false
},
// override of generated update method
updateRequireMe: function(value) {
this.allowBlank = !value;
}
});
用法:
xtype: 'MyComboBox',
valueField: '_id',
displayField: 'name',
queryMode: 'local',
requireMe: '{!allowBlank}',
bind: {
store: '{people}'
}
答案 1 :(得分:3)
Sencha并不总是擅长区分配置变量和属性变量。您有时需要go to the source。
配置变量在config
块内定义。这些变量将具有吸气剂和放大器。 setters生成,并且您可以绑定到。相反,属性直接在类的主体中定义。
正如您可能已经猜到的那样,allowBlank
- 在Ext.form.field.Text
类中定义 - 是直接定义的,因此它是一个属性,即使它有一个@cfg
文档标记。因此,它不能直接绑定。
你可以使它成为可绑定的 - 你只需要定义正确的方法。最简单的方法是创建一个Combobox的子类,并添加一个这样的部分:
config: { allowBlank: true }
然后在表单中使用该子类。但请注意,这可能还不够;因为班级不期望allowBlank
改变,所以它没有被处理(例如更改验证器等)
答案 2 :(得分:2)
你可以绑定到任何有相应的" set"方法。例如,有一个setStore()方法,因此您可以绑定到" store"。由于没有setAllowBlank(),因此无法绑定它。
答案 3 :(得分:1)
线程https://www.sencha.com/forum/showthread.php?339465-Why-allowBlank-isn-t-bindable建议可以重写基字段类而不是对其进行扩展。
所以在我的extjs 5.1.1.1中,解决方案很简单:
Ext.define('AdminKit.form.field.override.Text', {
override: 'Ext.form.field.Text',
setAllowBlank: function(value) {
this.allowBlank = value;
this.validate();
}
}