Backbone.js获取参数
按照文档 ,我做了:
var collection = new Backbone.Collection.extend({ model: ItemModel, url: '/Items' }) collection.fetch({ data: { page: 1} });
url竟然是: http://localhost:1273/Items?[object%20Object]
我期待像http://localhost:1273/Items?page=1
那么如何在获取方法中传递参数?
变化:
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。
你也可以设置processData为true:
collection.fetch({ data: { page: 1 }, processData: true });
jquery会自动将数据对象处理成参数string,
但在Backbone.sync函数中,Backbone将processDataclosures,因为Backbone将使用其他方法来处理POST,UPDATE …中的数据
在骨干来源:
if (params.type !== 'GET' && !Backbone.emulateJSON) { params.processData = false; }
另一个例子,如果你正在使用titanium合金:
collection.fetch({ data: { where : JSON.stringify({ page: 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); }