ExtJS组合框和过滤后的商店

时间:2016-03-11 17:40:02

标签: javascript extjs combobox

我在运行ExtJS 4.1组合框时遇到问题我已预先过滤了一个商店,它只是清除过滤器并显示所有数据。

我理解我遇到的问题是由于组合框清除了过滤器并应用了自己的(有点烦人,因为它不是你从组合框中立即期待的) ,但我不确定让它停下来的最好方法。

我目前(尝试)将MVC模型与在单独的商店文件中定义的一些AJAX样式存储一起使用,该模型具有在其中定义的商店存储数组及其中的视图&# 39; s views array,calls

    var targetStore = this.getStore('app.store.STargets');
    targetStore.filter('SOURCE', 'X');
    targetStore.load();

作为其初始化功能的一部分

和视图中的组合框,它引用了控制器定义的商店的商店配置变量。

xtype: 'combobox',
flex: 75,
fieldLabel: 'Target',
name: 'TargetId',
itemId: 'targetIdCombo',
store: 'app.store.STargets',
valueField: 'SYSID',
displayField: 'DISPLAY_NAME',
//typeAhead: true,
queryMode: 'local', 
triggerAction: 'all',
lastQuery: '',
emptyText: 'Select a target',
margin: '0 5 0 0',
listeners: {
    scope: this,
    change: function () {
        this.fireEvent('targetChanged'); // probably needs on select
        },
        beforequery: function(qe){
            // qe.query = qe.query +'&SOURCE=X'
            // delete qe.combo.lastQuery;
            // delete qe.combo.allQuery;
        }

根据文档,你意味着要对lastQuery或者之前的查询事件做些什么,尽管它并没有大规模地明确什么。我认为消隐内部查询也会阻止它减少组合框中的项目数量,因为你键入的并不是很好,理想情况下我想要维护这个功能,但仍然要过滤我的商店以显示只有SOURCE =' X'的记录。我可以确认我的商店是在加载时过滤的,因为我的数据数组比我的store.getCount()

更长

我试过网络示例:

  • delete qe.combo中的两个beforequery语句 - 结果=根本没有过滤
  • lastQuery设置为'' - 结果=根本没有过滤
  • 添加triggerAction: 'all' - 结果=根本没有过滤

我还考虑过将allQuery与triggerAction结合使用,试图通过SOURCE进行过滤,但是这种观点有太多的商业逻辑,同样让控制器寻找组合框轻弹查询会增加视图和控制器的耦合。

我看到的另一个建议是,要从预过滤的数据集中创建一个副本存储。这是有道理的,应该保持所需的过滤器输入行为,但作为一个相对的Ext和JS初学者,我不确定我是如何能够从我的视图中引用控制器创建的商店,我看到的示例使用的是商店数组,它们都是先前定义的商店(或者我是否意味着在我的视图中从过滤商店创建副本)

1 个答案:

答案 0 :(得分:0)

看来我过早应用过滤器了。

Controller的init函数在应用程序启动时被调用,并且按预期设置了商店的过滤器。

然而,当我导航到我的视图时,其他一些代码已经从我的商店中清除了过滤器,因此组合框再次显示未过滤的列表。

为了解决这个问题,我改为将过滤代码绑定到“后续”状态。观点的事件。

即。而不是

Controller.js
init: function () {
  ...
  var targetStore = this.getStore('app.store.STargets');
  targetStore.filter('SOURCE', 'X');
}

我现在有:

Controller.js
init: function () {
         this.control(
           {
           'viewitemid': {
                afterrender: function(){
                    var targetStore = this.getStore('app.store.STargets');
                    targetStore.filter('SOURCE', 'X');
                }
           });
      }

现在按预期过滤我的组合框,并且不清除过滤器