Javascript 如何将ViewModel存储绑定到视图?

Javascript 如何将ViewModel存储绑定到视图?,javascript,extjs,mvvm,extjs6,Javascript,Extjs,Mvvm,Extjs6,我是一个非常新的ExtJS,试图在一个 ViewModel有一个stores属性,您可以在这里看到: 我想在我的视图中绑定它,如下所示: 在这种情况下,存储将以null结束,并且没有数据加载到小部件中。但是,如果我只是在视图中硬编码它,而不是绑定存储,那么它就可以工作了 有人知道问题是什么吗?这是常见的问题。只要在存储中使用代理,就必须在viewrendered之后加载存储。基本上,将其添加到您的视图中: listeners: { afterrender: funct

我是一个非常新的ExtJS,试图在一个

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'
}