extjs 5 getStore().过滤器

extjs 5 getStore().filter

我创建了一个简单的函数。如果我将值添加到 users_filter(例如:var users_filter = "abc"),然后过滤检查名字。但是过滤器不检查中间名或姓氏或电子邮件。为什么?我不会在过滤器上使用逻辑或?

click: function(){
      Ext.getCmp('users').getStore().filter('firstname' ||'middlename' || 'lastname' || 'email',
      Ext.getCmp('users_filter').getValue());
}

你的第一个问题是基础 javascript。 or 运算符最初用于布尔运算。但是因为某些值的计算结果为真或假(truthy/falsy),我们可以利用它来发挥我们的优势,例如作业。

var filterVariable = 'firstname' ||'middlename' || 'lastname' || 'email';
    console.log(filterVariable); //returns 'firstname'

考虑这个片段:

var someFilter,
    defaultFilter = 'lastname';

if(condition) { 
    someFilter = 'firstname';
}

var filterVariable = someFilter || defaultFilter;

现在 if condition === true => filterVariable 计算为 'firstname' else => filterVariable 计算为 'lastname'

但要小心,如果 someFilter 设置为 "", 0, [], null, ...,它将评估为 false 并采用 defaultFilter...

所以你写的永远行不通!

除此之外.. 这会起作用:

click: function(){
    var store = Ext.getCmp('users').getStore(),
        val = Ext.getCmp('users_filter').getValue();

    store.filterBy(function(rec){
        return rec.get('firstname') === val ||
               rec.get('middlename') === val || 
               rec.get('lastname') === val ||
               rec.get('email') === val; 
    });
}

fwi:我尽量避免使用 Ext.getCmp()。如果您想要重复使用的部件,会发生什么情况。那么您可能有 2 个用户面板......并且代码已损坏。也许在这种情况下这听起来很愚蠢,但通常从您单击的按钮上下移动会更好...

click: function(button) { 
    var usersGrid = button.down('users'); 
    //...
}