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

时间:2015-08-04 16:02:30

标签: javascript extjs mvvm data-binding extjs5

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

4 个答案:

答案 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();
    }
}