0

如何覆盖 OpenLayers.Protocol.HTTP 的 url?我试过

searchformPanel.protocol.url

它可以工作(使用console.log检查),但最后会发送原始url(在下面的代码中:url:'/fs/')(见附图)。

萤火虫的输出

这是代码:

var searchformPanel = new GeoExt.form.FormPanel({
  border: false,
  width: 250,
  protocol: new OpenLayers.Protocol.HTTP({
    url: '/fs/',
    format: new OpenLayers.Format.GeoJSON()
  }),
  items:[{
    xtype: 'combo',
    id: 'idcombo',
    store: new Ext.data.SimpleStore({
      fields:['fsclass','ollayer'],
      data:[["Boreholes","Boreholes"],["All_layers","All layers"]]
    }),
    displayField: 'ollayer',
    valueField: 'fsclass',
    fieldLabel: 'Layer',
    emptyText: 'select a layer',
    submitValue: false,
    selectOnFocus: true,
    mode: 'local',
    typeAhead: true,
    editable: false,
    forceSelection: true,
    triggerAction: 'all'
  },{
    xtype: 'textfield',
    id: 'idtextfield',
    fieldLabel: 'Find features',
    emptyText: 'enter word',
    name: 'comments__like',
    allowBlank: false
  }],
  listeners:{
    actioncomplete: function(form, action){
      searchShowTip(action.response.features);
    }
  },
  buttons:[{
    text: 'search',
    listeners:{
      click: function(){

        var comboLayer = Ext.getCmp('idcombo').getRawValue();
        var keyword = Ext.getCmp('idtextfield').getRawValue();

        var newUrl = '/fs/' + comboLayer + '?format=GeoJSON&comments__ilike=' + keyword + '&queryable=comments';
        console.log('1:' + newUrl);

        //this gets '/fs/' from the searchformPanel
        console.log('2:' + searchformPanel.protocol.url);

        searchformPanel.protocol.url = newUrl;
        console.log('3:' + searchformPanel.protocol.url);

        searchformPanel.search();
      }
    }
  }]

});

非常欢迎对此的任何支持,谢谢!

4

2 回答 2

0

您的数据格式不正确:

data: [["Boreholes","Boreholes"],["All_layers","All layers"]]

应该是这样的:

data: { "Boreholes": "Boreholes", "All_layers": "All layers" }
于 2013-02-02T18:01:11.323 回答
0

终于成功了!!!!!!!!!诀窍是将协议放在 formPanel 之外,并将 newUrl 替换为“protocol.options.url = newUrl;”。在检查 OpenLayers 的 HTTP.js 的第 180 行之前,我不知道这个“选项”,因为我尝试使用 protocol.read() 并且收到指向该行的错误(如此所述)。此外,我正在重新发送 formPanel 的“评论”和“可查询”(所以我删除了上面的“关键字”),因为它是我自己在这个原始问题中发布的。这是一段代码,简单而漂亮:

buttons: [{
    text: 'Search',
    handler: function() {
        comboLayer = Ext.getCmp('idcombo').getValue();
        newUrl = '/fs/' + comboLayer + '?format=GeoJSON';
        protocol.options.url = newUrl;
        formPanel.search();
        }
    }]

另外,我对变量和局部/全局范围如何协同工作感到困惑,我想我想出了这个解决方案,因为我知道在“函数”中写东西(因为以上所有内容都在处理程序中调用的 function() 中)使变量在函数声明之前和之后被另一个变量读取,不确定我之前解释的内容是否清楚,但确保这个链接解释得更好。

希望这可以帮助更多的人,尤其是像我这样的 javascript 和 openlayers 新手!

于 2013-02-14T15:53:41.063 回答