在 ExtJS 中将模型属性绑定到表单字段非常容易:
// ...skipped everything until fields config for brevity
}, {
xtype: 'textfield',
bind: '{modelInstance.someField}'
}, { // ...
在这种情况下,modelInstance
字符串字段someField
将被同步到文本框的值,这要归功于两种方式的绑定。这很棒。
我想要实现的是在模型字段不是字符串而是数组的情况下获得相同的行为。这是模型:
Ext.define('namespace.model.CustomModel', {
fields: ['easyField', {
name: 'hardField',
type: 'auto' // This will be an array during runtime
}],
idProperty: 'easyField'
});
我想做这样的事情:
// ...skipped everything until fields config for brevity,
// assume that viewmodel and everything else are set up as expected
}, {
xtype: 'textfield',
bind: '{modelInstance.easyField}'
}, {
xtype: 'gridfield',
bind: {
gridArray: '{modelInstance.hardField}'
}
}, { // ...
可以理解,我希望gridfield
组件将Ext.grid.Panel
其存储数据扩展并同步到modelInstance
field hardField
。
目前我有这个:
Ext.define('namespace.form.field.GridField', {
extends: 'Ext.grid.Panel',
xtype: 'gridfield',
// skip requires for brevity
viewModel: {
stores: {
gridFieldItems: {
type: 'gridfielditems' // Simple in memory store
}
},
data: {
}
},
store: '{gridFieldItems}',
// This config enables binding to take place as it creates getters and setters,
// gridArray is set initially to '{modelInstance.hardField}' as expected
config: {
gridArray: null
},
// This is necessary for this grid-field component to update
// '{modelInstance.hardField}' back in the owners viewModel.
publishes: {
gridArray: true
},
// ???
// bind: {
// gridArray: bind gridArray to store data somehow?
// }
});
这是问题所在:
- 如何注入现有
modelInstance.hardField
数组作为gridFieldItems
存储初始数据, - 我如何绑定
gridArray
配置来存储数据,以便在我们对网格进行粗加工时进行更新, - 以优雅的 MVVM 方式完成所有这些操作,而无需编写一堆试图强制 JS 对象之间同步的侦听器。
请提供已知有效的测试解决方案,我自己已经尝试了很多不同的方法,但到目前为止没有成功。