我在运行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初学者,我不确定我是如何能够从我的视图中引用控制器创建的商店,我看到的示例使用的是商店数组,它们都是先前定义的商店(或者我是否意味着在我的视图中从过滤商店创建副本)
答案 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');
}
});
}
现在按预期过滤我的组合框,并且不清除过滤器