【问题标题】:Backbone.js fetch with parametersBackbone.js 带参数获取
【发布时间】:2011-10-03 07:25:51
【问题描述】:

按照documentation,我做到了:

var collection = new Backbone.Collection.extend({
        model: ItemModel,
        url: '/Items'
})

collection.fetch({ data: { page: 1} });

网址原来是:http://localhost:1273/Items?[object%20Object]

我期待像http://localhost:1273/Items?page=1这样的东西

那么如何在 fetch 方法中传递参数呢?

【问题讨论】:

  • 这绝对是奇怪的。根据the API docs,您所拥有的看起来应该可以正常工作。您使用的是最新版本的 Backbone.js 吗?
  • 你能试试JSON.stringify({ data: { page: 1} })吗?
  • @Joe Tuskan,我不知道该怎么办,但我做到了:collection.fetch(JSON.stringify({ data: { page: 1} })); 并且 URL 中没有传递任何内容。
  • 好的,这样做:collection.fetch({ data:JSON.stringify({ page: 1}) });
  • 这工作正常,因为您在 Backbone 1.0 fyi 中编写了它

标签: javascript backbone.js


【解决方案1】:
try {
    // THIS for POST+JSON
    options.contentType = 'application/json';
    options.type = 'POST';
    options.data = JSON.stringify(options.data);

    // OR THIS for GET+URL-encoded
    //options.data = $.param(_.clone(options.data));

    console.log('.fetch options = ', options);
    collection.fetch(options);
} catch (excp) {
    alert(excp);
}

【讨论】:

    【解决方案2】:

    另一个例子,如果你使用的是钛合金:

     collection.fetch({ 
         data: {
                 where : JSON.stringify({
                    page: 1
                 })
               } 
          });
    

    【讨论】:

    【解决方案3】:

    您也可以将 processData 设置为 true:

    collection.fetch({ 
        data: { page: 1 },
        processData: true
    });
    

    Jquery 会自动将数据对象处理成参数字符串,

    但是在 Backbone.sync 函数中, Backbone 将 processData 关闭,因为 Backbone 将使用其他方法来处理数据 在 POST、UPDATE...

    在主干源中:

    if (params.type !== 'GET' && !Backbone.emulateJSON) {
        params.processData = false;
    }
    

    【讨论】:

      【解决方案4】:

      改变:

      collection.fetch({ data: { page: 1} });
      

      到:

      collection.fetch({ data: $.param({ page: 1}) });
      

      因此,无需过度执行此操作,就可以将 {data: {page:1}} 对象称为 options

      Backbone.sync = function(method, model, options) {
          var type = methodMap[method];
      
          // Default JSON-request options.
          var params = _.extend({
            type:         type,
            dataType:     'json',
            processData:  false
          }, options);
      
          // Ensure that we have a URL.
          if (!params.url) {
            params.url = getUrl(model) || urlError();
          }
      
          // Ensure that we have the appropriate request data.
          if (!params.data && model && (method == 'create' || method == 'update')) {
            params.contentType = 'application/json';
            params.data = JSON.stringify(model.toJSON());
          }
      
          // For older servers, emulate JSON by encoding the request into an HTML-form.
          if (Backbone.emulateJSON) {
            params.contentType = 'application/x-www-form-urlencoded';
            params.processData = true;
            params.data        = params.data ? {model : params.data} : {};
          }
      
          // For older servers, emulate HTTP by mimicking the HTTP method with `_method`
          // And an `X-HTTP-Method-Override` header.
          if (Backbone.emulateHTTP) {
            if (type === 'PUT' || type === 'DELETE') {
              if (Backbone.emulateJSON) params.data._method = type;
              params.type = 'POST';
              params.beforeSend = function(xhr) {
                xhr.setRequestHeader('X-HTTP-Method-Override', type);
              };
            }
          }
      
          // Make the request.
          return $.ajax(params);
      };
      

      因此它将“数据”发送到jQuery.ajax,这将尽最大努力将params.data 的任何内容附加到 URL。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-11
        • 2013-11-30
        • 1970-01-01
        • 1970-01-01
        • 2012-11-05
        • 1970-01-01
        相关资源
        最近更新 更多