1

我正在尝试根据 4 个下拉列表中的不同选择来传递查询字符串。我通过变量传递查询字符串,但它被转义,因此结果是 404 错误。

这是我为制作查询字符串而编写的代码......

      function setQueryString(product,brand,demographic,region)
     {
      product =  dropdownlists.get('Product');
      brand = dropdownlists.get('Brand');
      demographic = dropdownlists.get('Demographic');
      region = dropdownlists.get('Region');
      if(product !=='' && brand !=='' && demographic !=='' && region !=='')
        {
           queryString = 'product='+product+'&'+'brand='+brand+'&'+'demographic='+demographic+'&'+'region='+region ;
           return queryString;
        }
      else{console.log('nevermind!!');}
     }

There is a view function updating the DataModel model with selected values every time user makes a selection.Based on these selections we get (colorscale) data from the server.

    var DataModel = Backbone.Model.extend({
              urlRoot : '/api/web/',
              idAttribute: 'value',
              defaults : {
                 Product : '',
                 Brand : '',
                 Demographic : '',
                 Region : ''
             }
      });
    var dropdownlists = new DataModel();



    var colorscalelist = new ColorScaleModel({value: setQueryString()});
         colorscalelist.fetch({success: function(){
         console.log(colorscalelist);
        }
      });

色阶模型是:

    var ColorScaleModel = Backbone.Model.extend({
    urlRoot : '/api/web/colorscale',
    idAttribute: 'value',
    defaults : {
            DPRBID: " ",
            F: "",
            BR1: " ",
            BR2: " ",
            BR3: " ",
            UN: " ",
            C: " ",
            T: " "
      }
        });

正在传递的 URL 被转换为 ASCII 字符。有没有办法直接通过,不转义。或者,有没有其他方法可以解决发送数据的问题。这是我的第一个 BackboneJS 项目,任何帮助都会很棒。谢谢你。

4

2 回答 2

1

Backbone 中的 Ajax 操作最终委托给 jQuery,因此接受将修改请求的选项。要添加请求参数,您可以传递data将作为查询字符串传输的参数。

例如,

var ColorScaleModel = Backbone.Model.extend({
    url : '/api/web/colorscale',

    defaults : {
    }
});

var dropdownlists = new DataModel({
    Product : 'P1',
    Brand : 'B1',
    Demographic : 'D1',
    Region : 'R1'
});

var colorscalelist = new ColorScaleModel();
colorscalelist.fetch({
   data: dropdownlists.toJSON() 
});

将导致请求/api/web/colorscale?Brand=B1&Demographic=D1&Product=P1&Region=R1

有关演示,请参见http://jsfiddle.net/nikoshr/wufbL/

您可以更进一步,通过覆盖将过滤器合并到模型中model.fetch。例如:

var ColorScaleModel = Backbone.Model.extend({
    url : '/api/web/colorscale',

    defaults : {
    },

    initialize: function(attrs, opts) {
        this.filters = opts.filters;
    },

    fetch: function(opts) {
        opts = opts || {};
        opts.data = this.filters.toJSON();

        return Backbone.Model.prototype.fetch.call(this, opts);
    }
});

var dropdownlists  = new DataModel();
var m = new ColorScaleModel({}, {filters: dropdownlists});
m.fetch();

f.set({Product: "P1", Brand: "B1"});
m.fetch();

还有一个可以玩的小提琴http://jsfiddle.net/nikoshr/wufbL/1/

于 2013-07-10T09:47:03.033 回答
0

setQueryString()您的函数应该返回一个查询对象,而不是一个字符串。所以而不是

queryString = 'product='+product+'&'+'brand='+brand+'&'+'demographic='+demographic+'&'+'region='+region 

你应该回来

{
    product: product,
    brand: brand,
    demographic: demographic,
    region: region
}

然后,在fetch调用中将此对象作为data参数传递。就像是

colorscalelist.fetch({ data: getQuery(), success: function() { ... } });

getQuery()返回上面的对象,在我看来是一个比setQueryString()...更好的名字)

然后该fetch函数会将您的查询对象序列化为查询字符串并执行所有必要的转义。

于 2013-07-10T09:42:14.587 回答