Javascript 如何将ViewModel存储绑定到视图?
我是一个非常新的ExtJS,试图在一个Javascript 如何将ViewModel存储绑定到视图?,javascript,extjs,mvvm,extjs6,Javascript,Extjs,Mvvm,Extjs6,我是一个非常新的ExtJS,试图在一个 ViewModel有一个stores属性,您可以在这里看到: 我想在我的视图中绑定它,如下所示: 在这种情况下,存储将以null结束,并且没有数据加载到小部件中。但是,如果我只是在视图中硬编码它,而不是绑定存储,那么它就可以工作了 有人知道问题是什么吗?这是常见的问题。只要在存储中使用代理,就必须在viewrendered之后加载存储。基本上,将其添加到您的视图中: listeners: { afterrender: funct
ViewModel
有一个stores
属性,您可以在这里看到:
我想在我的
视图中绑定它,如下所示:
在这种情况下,存储
将以null
结束,并且没有数据加载到小部件中。但是,如果我只是在视图中硬编码它,而不是绑定存储,那么它就可以工作了
有人知道问题是什么吗?这是常见的问题。只要在存储中使用代理,就必须在viewrendered之后加载存储。基本上,将其添加到您的视图中
:
listeners: {
afterrender: function(view) {
this.getViewModel().getStore('{test}').load(); // this will provide proxy is being loaded
}
}
编辑:我没有注意到您已经将自动加载:true
放入了。经过一些研究,multiselect组件必须在渲染期间获得“存储对象”。这就是为什么会出现“自动创建”错误。我的意思是,在创建multiselect之前,必须先创建它的存储。在本例中,首先创建multiselect组件,然后将存储绑定到multiselect。要解决此问题,请检查此小提琴:
您还可以将空对象作为存储传递给绑定存储,这样initComponent
就可以工作,例如:
{
xtype: 'multiselect',
fieldLabel: 'Multiselect',
store: {},
bind: {
store: '{test}'
},
valueField: 'id',
displayField: 'name'
}
工作示例:为什么决定存储为空?对我来说,提供的代码片段很好,应该可以工作。您应该提供视图的所有代码,最好是提供jfiddle或sencha fiddle来演示这个问题。@yorlin-谢谢,我将尝试组装一个sencha fiddle。错误是uncaughttypeerror:无法读取null的属性“autoCreated”
我拥有视图的精确绑定结构,但对于Combobox,它不起作用。通过为combo设置“queryMode:local”,它可以工作很多分钟|你认为这是一个bug还是只是一个未记录的奇怪现象?您需要像这样传递两次store
是否很常见?实际上,当您绑定一个存储时,extjs首先创建一个空存储(不是null,而是一个临时存储),然后绑定一个普通存储。问题是绑定是异步的,并且有延迟。问题是你想什么时候访问你的商店。当extjs还没有准备好时,即使存储空间是空的,您也可以尝试访问存储。@yorlin——这是有道理的,但我觉得这是一个新的extjs开发人员不需要知道的实现细节。它需要与store
相关的冗余语法。我遇到了同样的问题,当我尝试添加:store:{},
绑定延迟,这样我的多组合框就不会出现下拉列表。我使用这个:+1,但我更喜欢另一个解决方案。虽然两者都不是很令人满意。对我来说好像是个虫子。
listeners: {
afterrender: function(view) {
this.getViewModel().getStore('{test}').load(); // this will provide proxy is being loaded
}
}
listeners: {
afterrender: function(view) {
view.add({
xtype: 'multiselect',
scrollable: false,
allowBlank: true,
ddReorder: true,
fieldLabel: 'Multiselect',
store: view.getViewModel().getStore('test'), // comment to get autoCreated error
valueField: 'id',
displayField: 'name'
});
}
},
{
xtype: 'multiselect',
fieldLabel: 'Multiselect',
store: {},
bind: {
store: '{test}'
},
valueField: 'id',
displayField: 'name'
}