来自另一个viewmodel的链式存储源

时间:2015-06-18 10:22:12

标签: extjs mvvm viewmodel

我想实现链式存储,其源存储放在另一个ViewModel中。如果我像往常一样写,链式存储是空的,因为View Model无法以这种方式从另一个ViewModel看到存储。

sport_chained: {
    source: 'sport' // sport is in another viewmodel
} 

我找到了这个解决方案:

// in ViewModel
constructor: function () {
    this.callParent(arguments);
    Ext.defer(function () {
        this.setStores({
            sport_chained: {
                source: Ext.data.StoreManager.lookup('sport')
            }
        });
    },10);
} 

但它不方便,因为那时我必须在构造函数中放置此ViewModel中的所有其他商店。也许有人做了这样的事情并知道如何以更方便的方式做到这一点? https://fiddle.sencha.com/#fiddle/otn

1 个答案:

答案 0 :(得分:0)

对于那些最终来到这里的人可能会有所帮助。我能做到这一点......但你必须考虑一下......

所以,我在某个父组件上有一个viewModel,我希望子组件能够将商店链接到父组件......

ParentViewModel.js

alias: 'viewmodel.parent',
stores: {
    parentStore: {
        model: 'MyApp.model.CoolModel'
    }
}

ChildViewModel.js

alias: 'viewmodel.child',
stores: {
    childStore: {
        model: 'MyApp.model.CoolModel'
    }
}

ChildView.js

extend: 'Ext.grid.Panel',
alias: 'wiget.child',
{
    viewModel: {
        type: 'child'
    }
}

ParentView.js

alias: 'wiget.parent',
{
    viewModel: {
        type: 'parent'
    }
},

items: [
    {
        xtype: 'child',
        viewModel: {
            stores: {
                childStore: {
                    // Notice the binding to the parent store without the bind wrapper - no idea why it's done that way
                    source: '{parentStore}'
                }
            }
        },

        // So we chained the childStore to the parentStore above using the source..then we can bind to the chained store below like you would expect
        bind: {
            store: '{childStore}'
        }
    }
]

这些只是简短的片段,但希望它能说明如何以声明方式进行链接,而不必通过控制器强制解决问题。还有一点需要注意 - 我扩展了一个网格面板,因此很容易说明绑定商店。