Sencha Touch — Как применить разные фильтры к одному хранилищу для разных целей?

#sencha-touch #extjs

#sencha-touch #extjs

Вопрос:

Просто интересно, есть ли способ справиться с этим в Sencha Touch. Одно хранилище и после применения разных фильтров хранилище можно использовать для разных мест.

Например:

У меня есть хранилище:

 Ext.regModel('abc', {
    fields: [{name: 'tid', type: 'int'}, {name: 'name',  type: 'string'}, {name: 'parent', type: 'int'}]
});

var store = new Ext.data.Store({
     model: 'abc',
     proxy: {
        type: 'ajax',
        url : 'read.php',
        reader: {
            type: 'json',
            root: 'items',
            fields: ['tid', 'name', 'parent']
        }
    },
    autoLoad: true,
});
  

И в FormPanel у него есть два selectfields:

 items: [
    {
        xtype: 'selectfield',
        name : 'One',
        label: 'Category',
        // store: store, <-- Load the whole store
        store: function(){
            store.filter('name', 'digital'); <-- Load part of store
        },
        displayField: 'name',
        valueField: 'tid'
    },{
        xtype: 'selectfield',
        name : 'Two',
        label: 'subCategory',
        // store: store, <-- Load the whole store
        store: function(){
            store.filter('parent', 1); <-- Load part of store
        },
        displayField: 'name',
        valueField: 'tid'
    },{
    ...}
]
  

Ответ №1:

Боюсь, что нет, вам нужно два экземпляра вашего хранилища.

Почему бы не расширить свой магазин, просто чтобы он был предварительно настроен следующим образом:

 Ext.regModel('abc', {
fields: [{name: 'tid', type: 'int'}, {name: 'name',  type: 'string'}, {name: 'parent', type: 'int'}]});

MyStore = Ext.extend(Ext.data.Store, {
constructor: function(config) {

config = Ext.apply({

 model: 'abc',
 proxy: {
    type: 'ajax',
    url : 'read.php',
    reader: {
        type: 'json',
        root: 'items',
        fields: ['tid', 'name', 'parent']
    }
},
autoLoad: true,
}, config);

MyStore.superclass.constructor.call(this, config);
  

}

})

Затем вы можете использовать несколько экземпляров своего хранилища и фильтровать их по своему усмотрению:

 items: [
{
    xtype: 'selectfield',
    name : 'One',
    label: 'Category',
    store: new MyStore(), //1st instance of MyStore
    displayField: 'name',
    valueField: 'tid',
listeners : {
   'render' : function(){
        this.store.filter('name', 'digital');
    }
}
},{
    xtype: 'selectfield',
    name : 'Two',
    label: 'subCategory',
    store: new MyStore(), //2nd instance of MyStore
    displayField: 'name',
    valueField: 'tid',
listeners : {
   'render' : function(){
        this.store.filter('parent', 1);;
    }
}
},{
...}
  

]