【发布时间】:2016-11-26 12:36:27
【问题描述】:
我正在用 Ext JS 编写一个自定义组件,它需要一个存储作为其配置的一部分。我想把这个 store 保存在组件的 ViewModel 中,并且我也希望它是可绑定的。目前我有这样的代码:
Ext.define('CustomComponent', {
extend: 'Ext.container.Container',
xtype: 'customcomponent',
viewModel: {
type: 'customcomponent'
},
config: {
store: 'ext-empty-store'
},
initComponent: function() {
var store = Ext.getStore(this.getConfig('store'));
this.lookupViewModel().set('myStore', store);
this.callParent(arguments);
}
});
Ext.define('CustomComponentViewModel', {
extend: 'Ext.app.ViewModel',
alias: 'viewmodel.customcomponent',
data: {
myStore: null
}
});
由于多种原因,这并不理想:
-
store配置选项不可绑定。 - 商店包含在 ViewModel 的
data中,而不是stores中。这意味着它不能通过 ViewModel 的getStore方法访问。
为了使商店可绑定,我可以编写如下代码:
Ext.define('CustomComponent', {
extend: 'Ext.container.Container',
xtype: 'customcomponent',
viewModel: {
type: 'customcomponent'
},
config: {
store: 'ext-empty-store'
},
publishes: 'store'
});
Ext.define('CustomComponentViewModel', {
extend: 'Ext.app.ViewModel',
alias: 'viewmodel.customcomponent',
data: {
store: null
},
formulas: {
myStore: function(get) {
return Ext.getStore(get('store'));
}
}
});
不过,这也不理想:
- ViewModel 被
store配置污染,不一定是Ext.data.Store。它可以是商店的 ID 或配置对象。从本质上讲,它是一个实现细节,我希望将它保留在 ViewModel 之外,它会被每个子组件继承。 - 商店仍然不是 ViewModel 商店配置的一部分,因此仍然无法通过
getStore访问。
基本上,我正在寻找一种方法来设置我的 View 和 ViewModel(以及 ViewController,如果有帮助的话),这样我就可以满足这三个条件:
- 视图上的
store配置是可绑定的。 -
store配置选项未保留在 ViewModel 中,或者以某种方式防止污染组件子级的 ViewModel。 - 可通过
getStore访问 ViewModel 中的商店。
是否有可能同时满足所有这三个条件?如果不是,将可绑定存储配置转换为 ViewModel 存储的最规范方法是什么? Ext JS 源码没有使用 View-ViewModel 架构来定义组件,所以我不能只看他们做了什么。
【问题讨论】:
标签: javascript extjs data-binding extjs6