2014-01-03 2 views
0

У меня есть dataview, который отображает данные json из магазина. Как фильтровать магазин или данные в сенчане?

 
    Ext.define('app.view.Abouttest', { 
     extend: 'Ext.Panel', 
     xtype: 'abouttest',

config: { 
      title: 'Player Info', 
      iconCls: 'user', 
      layout: 'vbox', 
      scrollable: true, 
      height: 800, 
      fullscreen: false, 

      items: [ 
       { 
        docked: 'top', 
        xtype: 'toolbar', 
        id: 'toolbarId', 
        title: 'Player Info' 
       }, 
       { 
        xtype: 'dataview', 
        store: 'Articles', 
        itemTpl: '<div>{content}</div>', 
        height: 400 
       } 
      ] 
     } 
}); 
</pre> 

это модель и магазин, который также используется в вложенном списке в другой точке зрения:

<pre> 
Ext.define('app.model.Article', { 
    extend: 'Ext.data.Model', 

    config: { 
     fields: [ 
     'id', 
     {name: 'parent', type: 'int'}, 
     {name: 'title', type: 'string'}, 
     {name: 'content', type: 'string'} 
     ] 
    } 
}); 

Ext.define('app.store.Articles', { 
    extend: 'Ext.data.Store', 

    requires: ['app.model.Article'], 

    config: { 
     model: 'app.model.Article', 
     autoLoad: true, 

     proxy: { 
      type: 'ajax', 
      url: 'resources/json/articles.json', 
      noCache: false, 
      enablePagingParams: false,   
      reader: { 
      type: "json", 
      rootProperty: 'pages' 
      } 
     } 
    } 
}); 
</pre> 

Какого код может быть добавлена ​​к представлению Abouttest для фильтрации данных хранилища для отображения одной записи на основе по его ID?

Вот окончательный вариант зрения

<pre> Ext.define('app.view.Abouttest', { extend: 'Ext.Panel', xtype: 'abouttest', config: { title: 'Player Info', iconCls: 'user', layout: 'vbox', scrollable: true, height: 800, fullscreen: false, items: [ { docked: 'top', xtype: 'toolbar', id: 'toolbarId' }, { xtype: 'dataview', store: 'Articles', itemTpl: '<div>{content}</div>', height: 400 } ] }, initialize: function(eOpts) { var store = Ext.getStore('Articles'); if (store.loading) { store.on('load', function() { store.filterBy(function(rec) { return rec.get('id') === '246'; }); }); } } }); </pee>
+0

Фильтрация может быть достигнуто путем добавления инициализировать функцию фильтрации при загрузке магазина. – AlanP

ответ

0

Я бы фильтровать вид из контроллера, но если вы хотите, чтобы отфильтровать его с точки зрения вы можете сделать это путем добавления или один из этих методов с точки зрения и называя их:

filterById: function(recordId) { 
    var store = Ext.getStore('Articles'); 
    if (recordId) { 
     store.filterBy(function(rec) { 
      return rec.get('id') === recordId; 
     }); 
    } else { 
     store.clearFilter(); 
    } 
} 

ИЛИ (получение магазин от компонента вместо непосредственно)

filterById: function(recordId) { 
    var store = this.down('dataview').getStore(); 
    if (recordId) { 
     store.filterBy(function(rec) { 
      return rec.get('id') === recordId; 
     }); 
    } else { 
     store.clearFilter(); 
    } 
} 

Успехов, Роб

EDIT: добавлен полный пример ...

Хорошо, окончательная попытка;)

То, что вы, вероятно, забыли, это создать экземпляр вашего магазина. Простое определение не создает его. Когда вы добавляете хранилище в контроллер (приложение также является контроллером), «сохраняет» конфигурацию, он автоматически создается. Кнопки либо очищают фильтр, либо добавляют простой фильтр по идентификатору. Обычно вы не должны делать этого в представлении, но этот фрагмент является просто доказательством концепции. Я предложил бы использовать соответствующую модель MVC в Сенча Touch,

I (на самом деле) надеюсь, что это ответ на ваш вопрос

Ext.define('app.model.Article', { 
    extend: 'Ext.data.Model', 

    config: { 
     fields: [ 
      'id', { 
       name: 'parent', 
       type: 'int' 
      }, { 
       name: 'title', 
       type: 'string' 
      }, { 
       name: 'content', 
       type: 'string' 
      } 
     ] 
    } 
}); 

Ext.define('app.store.Articles', { 
    extend: 'Ext.data.Store', 

    requires: ['app.model.Article'], 

    config: { 
     model: 'app.model.Article', 
     // autoLoad: true, 

     data: [{ 
      id: 1, 
      parent: null, 
      title: 'First article', 
      content: 'Lorem ipsum dolor sit amet, consectetur adipisicing elit. Placeat impedit quaerat reiciendis eveniet soluta commodi.' 
     }, 
     { 
      id: 2, 
      parent: null, 
      title: 'Second article', 
      content: 'Lorem ipsum dolor sit amet, consectetur adipisicing elit. Placeat impedit quaerat reiciendis eveniet soluta commodi.' 
     }, 
     { 
      id: 3, 
      parent: null, 
      title: 'Third article', 
      content: 'Lorem ipsum dolor sit amet, consectetur adipisicing elit. Placeat impedit quaerat reiciendis eveniet soluta commodi.' 
     }] 
     // proxy: { 
     // type: 'ajax', 
     // url: 'resources/json/articles.json', 
     // noCache: false, 
     // enablePagingParams: false,   
     // reader: { 
     //  type: "json", 
     //  rootProperty: 'pages' 
     // } 
     // } 
    } 
}); 

Ext.create('app.store.Articles', { 
    storeId: 'Articles' 
}); 


Ext.define('app.view.Abouttest', { 
    extend: 'Ext.Panel', 
    xtype: 'abouttest', 

    config: { 
     title: 'Player Info', 
     iconCls: 'user', 
     layout: 'vbox', 
     scrollable: true, 
     height: 800, 
     fullscreen: false, 

     items: [{ 
      docked: 'top', 
      xtype: 'toolbar', 
      id: 'toolbarId', 
      title: 'Player Info', 
      items: [{ 
       xtype: 'spacer' 
      },{ 
       xtype: 'button', 
       text: 'clear filter', 
       handler: function(button) { 
        button.up('abouttest').down('dataview').getStore().clearFilter(); 
       } 
      },{ 
       xtype: 'button', 
       text: 'inline filter', 
       handler: function(button) { 
        button.up('abouttest').down('dataview').getStore().filterBy(function(rec) { 
         return rec.get('id') === 1; 
        }); 
       } 
      }, 
      { 
       xtype: 'button', 
       text: 'component filter', 
       handler: function(button) { 
        button.up('abouttest').filterFoo(); 
       } 
      }] 
     }, { 
      xtype: 'dataview', 
      store: 'Articles', 
      itemTpl: '<h1>{title}</h1><div>{content}</div>', 
      height: 400 
     }] 
    }, 

    filterFoo: function() { 
     this.down('dataview').getStore().filterBy(function(rec) { 
      return rec.get('id') === 1; 
     }); 
    } 
}); 

Ext.Viewport.removeAll(); 

Ext.Viewport.add({ 
    xtype: 'abouttest' 
}); 
+0

Не повезло, что это сработало. Вопросы: 1. Я вызываю это из события, такого как инициализация? 2. Я поместил функцию вне конфига, но до}); но я получаю filterById не определенную ошибку. Любой совет? – AlanP

+0

Вы должны разместить функцию на том же уровне, что и объект конфигурации, а не внутри нее. В качестве теста вы можете вызвать функцию с вашей консоли, используя Ext.ComponentQuery.query ('abouttest') [0] .filterById (1) , чтобы проверить это. Если вы хотите, чтобы фильтр хранилища на идентификаторе немедленно предлагал сделать это onLoad в магазине –

+0

, я ценю вашу помощь Роба, но я попытался разместить функцию на разных позициях в файле, но я все равно становлюсь неопределенным. Если у кого-нибудь есть пример фильтра на dataview в представлении, вставьте весь файл вместо частичного ответа, который покажет мне, как его реализовать.Спасибо – AlanP

0

Вы можете добавить фильтр в магазин

Ext.define('app.store.Articles', { 
    extend: 'Ext.data.Store', 

    requires: ['app.model.Article'], 

    config: { 
     model: 'app.model.Article', 
     autoLoad: true, 
     sorters: 'content', 
     filters: [{ 
        property: 'id', 
       }], 
     proxy: { 
      type: 'ajax', 
      url: 'resources/json/articles.json', 
      noCache: false, 
      enablePagingParams: false,   
      reader: { 
      type: "json", 
      rootProperty: 'pages' 
      } 
     } 
    } 
}); 
+0

Как я могу сказать в представлении, для которого записывается файл? – AlanP

Смежные вопросы