Backbone.js tìm nạp với các tham số


152

Theo tài liệu , tôi đã làm:

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

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

url hóa ra là: http://localhost:1273/Items?[object%20Object]

Tôi đã mong đợi một cái gì đó như http://localhost:1273/Items?page=1

Vậy làm thế nào để tôi vượt qua params trong phương thức tìm nạp?


Điều đó thực sự kỳ lạ. Những gì bạn có trông giống như nó sẽ hoạt động tốt, dựa trên các tài liệu API . Bạn có đang sử dụng phiên bản mới nhất của Backbone.js không?
Matt Ball

Bạn có thể thử JSON.stringify({ data: { page: 1} })không
Joe

@Joe Tuskan, tôi không biết phải làm gì với điều đó, nhưng tôi đã làm: collection.fetch(JSON.stringify({ data: { page: 1} }));và không có gì được thông qua trong url.
Shawn Mclean

Ok, làm điều này: Collection.fetch ({data: JSON.opesify ({page: 1})});
Joe

3
Điều này hoạt động tốt khi bạn viết nó trong Backbone 1.0 fyi
Dominic

Câu trả lời:


213

thay đổi:

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

đến:

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

Vì vậy, ngoài việc thực hiện nó, điều này được gọi với {data: {page:1}}đối tượng của bạn là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);
};

Vì vậy, nó sẽ gửi 'dữ liệu' tới jQuery.ajax , nó sẽ cố gắng hết sức để nối bất cứ thứ gì params.datavào URL.


71

Bạn cũng có thể đặt processData thành true:

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

Jquery sẽ tự động xử lý đối tượng dữ liệu thành chuỗi param,

nhưng trong chức năng Backbone.sync, Backbone tắt processData vì Backbone sẽ sử dụng phương thức khác để xử lý dữ liệu trong POST, UPDATE ...

trong nguồn xương sống:

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


-2
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);
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.