【发布时间】:2017-11-23 07:10:50
【问题描述】:
在 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字段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 对象之间同步的侦听器。
请提供已知可行的经过测试的解决方案,我自己已经尝试了很多不同的方法,但到目前为止都没有成功。
【问题讨论】:
标签: extjs mvvm data-binding extjs6 two-way-binding