【问题标题】:How to filter a list in Sencha Touch 2?如何在 Sencha Touch 2 中过滤列表?
【发布时间】:2012-07-30 10:44:13
【问题描述】:

我正在按代码过滤股票列表,但它不起作用。也许代码有问题?我错过了什么?以下是我尝试过的一些事情:

function filterBySymbol: function(select, value) {

    var ordersStore = this.getBrokerageOrderHistoryList().getStore();

    ordersStore.clearFilter();

    if (value !== '') {
        ordersStore.data.filterBy(function (record, id) {
            // log to make certain this gets called (and it is)
            console.log(id, record.get('symbol') === value);
            return record.get('symbol') === value;
        });

// Other things I've tried (nothing worked):
// 1)
//          var f = new Ext.util.Filter({
//             filterFn: function(record) {
//                return record.get('symbol') === value;
//             }
//          });
//          ordersStore.filterBy(f);
// 2)
//          ordersStore.filter(function (record) {
//              return record.get('symbol') === value;
//          });
// 3)
//          this.getBrokerageOrderHistoryList().setStore(ordersStore);
//          this.getBrokerageOrderHistoryList().refresh();
    }
}

【问题讨论】:

    标签: list filter sencha-touch-2 dataview


    【解决方案1】:

    事实证明,我们必须在商店中禁用远程过滤,这应该默认为 false,但事实并非如此:

    this.getOrderList().getStore().setRemoteFilter(false);
    

    【讨论】:

      【解决方案2】:

      其中一个应该可以工作

      // 1
      ordersStore.filter("symbol", value);
      
      // 2
      ordersStore.filter([    
          { filterFn: function(item) { return item.get("symbol") === value; }}
      ]);
      
      // 3
      ordersStore.filterBy(function(item) { 
      return item.get("symbol") === value; 
      }
      

      更新: 有效的示例:

      Ext.define('ST.store.Products', {
          extend: 'Ext.data.Store',
      
          config: {
              fields: ["title", "category" ],
              storeId: "Products",
      
              data: [
                  { title: 'Text1', category: 'cat1'},
                  { title: 'Text2', category: 'cat2'},
                  { title: 'Text3', category: 'cat3'},
              ]
          }
      });
      
       console.log("before");
              Ext.getStore("Products").each(function(item){
                  console.log(item.data.title);
      
              });        
      
              Ext.getStore("Products").filterBy(function(item){
                  return item.get('title') == 'Text1';    
              });
      
              console.log("after");
              var store = Ext.getStore("Products").each(function(item){
                  console.log(item.data.title);
      
              });  
      

      在我的情况下,我在开发者控制台中看到以下内容

      before 
      Text1
      Text2
      Text3
      after
      Text1
      

      【讨论】:

      • 不幸的是,这些都不起作用。传递给 orderStore.filterBy 的 lambda 永远不会被调用。如果传递给 orderStore.data.filterBy,它会被调用。 filterFn 也不会被调用。不确定第一种方法,但列表内容不会改变:\
      • 您的商店配置似乎不正确。我用示例更新了帖子,它有效
      • 谢谢。你可能是对的。我有一个模型和一个商店,该模型有一个 hasMany 属性,指向另一个模型。我想,我应该为 hasMany 属性所引用的模型创建一个商店。
      猜你喜欢
      • 2012-09-13
      • 2013-04-16
      • 2012-06-17
      • 2012-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-24
      • 1970-01-01
      相关资源
      最近更新 更多