ExtJS 5:绑定到其他 class 属性,例如 allowBlank

ExtJS 5: bind to other class properties, like allowBlank

我对允许绑定哪些配置值以及不允许绑定哪些配置值感到困惑。目前,不允许绑定 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 或任何其他 属性 绑定到公式?这甚至可能吗,还是我完全不了解某些东西?如果是这样,我怎么知道我可以绑定什么和不能绑定什么?

Sencha 并不总是善于区分配置变量和 属性 变量。你有时需要 go to the source.

配置变量在 config 块中定义。这些是将生成 getter 和 setter 的变量,您可以绑定到这些变量。相比之下,属性直接在 class.

的主体中定义

您可能已经猜到了,allowBlank - 在 Ext.form.field.Text 中定义 class - 是直接定义的,因此是一个 属性,即使它有一个@cfg 文档标记。因此,它不能直接绑定。

不过,您可以使其可绑定 - 您只需要定义正确的方法。最简单的方法是创建 Combobox 的子 class,并添加如下部分:

config: { allowBlank: true }

然后在您的表单中使用该子class。但是请注意,这可能还不够;因为 class 不期望 allowBlank 发生变化,所以它没有被连接起来处理(例如改变验证器等等)

只能绑定具有 setter 的属性,docs 中应存在设置方法。 '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}'
}

您可以绑定到任何具有相应 "set" 方法的 属性。例如,有一个 setStore() 方法,因此您可以绑定到 "store"。因为没有setAllowBlank(),所以不能绑定。

话题 https://www.sencha.com/forum/showthread.php?339465-Why-allowBlank-isn-t-bindable 建议可以覆盖基字段 class 而不是扩展它。

所以在我使用 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();
    }
}