仅当存储大小为 0 时如何发送 AJAX 请求

Posted

技术标签:

【中文标题】仅当存储大小为 0 时如何发送 AJAX 请求【英文标题】:How to send AJAX Request only if store size is 0 【发布时间】:2012-12-19 17:17:32 【问题描述】:

如何在当前存储大小为 0 的条件下发送组合框的 AJAX 请求。

基本上我有两个级联的远程组合框,并且都是延迟加载(此行为无法更改)

我发现即使第二个组合框是基于第一个组合框扩展时的事件级联的,它也会对服务器进行 AJAX 调用(虽然只有第一个扩展)

querymode local 和 autoload 选项将不起作用,因为它会在创建商店时在页面加载时加载组合框。

下面给出的是代码 sn-p。

  xtype: 'combo',id='firstcombo', name: 'DEFAULT_VALUE' ,minChars:2, value: decodehtmlContent('') ,width:200 ,listWidth:500, resizable: true,
 valueField : 'id', displayField: 'id', pageSize: 15,forceSelection:true, enableKeyEvents: true,
 store: new Ext.data.Store(reader: new Ext.data.CFQueryReader(id: 'NAME', 
            fields:[name:'id', mapping:'id']), 
            fields: [name:'id', mapping:'id'], 
            url:'server/ajax/Params'
            

 ),
 listeners : 
         select:function(combo, record, index) 
            this.setRawValue(decodeHtmlContent(record.get('id')));
            cascadeFields();
        



 xtype: 'combo',id='secondcombo', name: 'DEFAULT_VALUE' ,minChars:2, value: decodeHtmlContent('') ,width:200 ,listWidth:500, resizable: true,
 valueField : 'id', displayField: 'id', pageSize: 15,forceSelection:true, enableKeyEvents: true,
 store: new Ext.data.Store(reader: new Ext.data.CFQueryReader(id: 'NAME', 
            fields:[name:'id', mapping:'id']), 
            fields: [name:'id', mapping:'id'], 
            url:'server/ajax/Params',
            baseParam:valuefirst:''
            ,
            listeners: 

                beforeload: function(store, options) 
                    var value = Ext.getCmp('fistcombo').value;
                    Ext.apply(options.params, 

                                valuefirst:value
                            );


                , 

 ),
 listeners : 
         select:function(combo, record, index) 
            this.setRawValue(decodeHtmlContent(record.get('id')));
        


function cascadeFields()


  var combo = Ext.getCmp('secondcombo');

  if(combo.store)
  

  var store = combo.store;


  combo.setDisabled(true);
  combo.clearValue('');
  combo.store.removeAll();
  combo.store.load();        
  combo.setDisabled(false);

  

【问题讨论】:

【参考方案1】:

要扩展您的代码,您可以这样做

listeners: 
    beforeload: function(store, options) 
        if (store.getCount() > 0) 
            return false; // will abort the load operation.
        
        var value = Ext.getCmp('fistcombo').value;
        Ext.apply(options.params, 
             valuefirst:value
        );
    

这在 ExtJS 3.x 和 ExtJS4.x 中应该是一样的,因为你没有指定这个。但我猜你正在使用 3.x

如果这让组合挂起,请给我反馈,因为还有另一种但更复杂的方法。

【讨论】:

我在您完成后 17 秒发布了完全相同的解决方案。 +1 这是我通过这个输入解决的问题。基本上我有两个组合框,我根据其他组合框中的“选择”事件级联第二个组合框。如果第二个组合框是级联的,用户不应该能够通过刷新或直接提供 AJAX 请求来重新加载该组合框。 'beforeLoad' 方法中的这种检查避免了这种情况。 这个人的答案旁边有一个“标记正确”按钮。你应该使用它。很抱歉这么坦率,但如果这解决了你的问题,这就是 sra 在很大程度上意味着什么。

以上是关于仅当存储大小为 0 时如何发送 AJAX 请求的主要内容,如果未能解决你的问题,请参考以下文章

将 ajax 响应中的变量存储为全局变量并用于发送其他 ajax 请求?

ajax如何可以发送同步请求

Ajax向服务器发送请求和接收返回的信息

请求网站时与发送的用户代理不同的 Javascript 用户代理(ajax)

10秒后服务器响应时如何使用ajax发送请求?

如何使用asp.net核心在action方法中接收通过ajax请求发送的文件和整数