Backbone.js ดึงข้อมูลด้วยพารามิเตอร์


152

ตามเอกสารฉันทำ:

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

ดังนั้นฉันจะส่ง params ในวิธีการดึงข้อมูลได้อย่างไร


มันแปลกมาก สิ่งที่คุณต้องดูเหมือนว่ามันควรจะทำงานได้ดีขึ้นอยู่กับเอกสารของ API คุณใช้ Backbone.js เวอร์ชันล่าสุดอยู่หรือไม่?
Matt Ball

คุณลองได้JSON.stringify({ data: { page: 1} })ไหม
Joe

@ Joe Tuskan ฉันไม่แน่ใจว่าจะทำอย่างไรกับสิ่งนั้น แต่ฉันทำ: collection.fetch(JSON.stringify({ data: { page: 1} }));และไม่มีอะไรใน url
Shawn Mclean

ตกลงทำสิ่งนี้: collection.fetch ({data: JSON.stringify ({หน้า: 1})});
Joe

3
ทำงานได้ดีตามที่คุณเขียนไว้ใน Backbone 1.0 fyi
Dominic

คำตอบ:


213

การเปลี่ยนแปลง:

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


71

คุณยังสามารถตั้งค่า processData เป็นจริง:

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

Jquery จะประมวลผลข้อมูลวัตถุโดยอัตโนมัติเป็นสตริงพารามิเตอร์

แต่ในฟังก์ชั่น Backbone.sync Backbone ปิดโปรเซสข้อมูลเพราะ Backbone จะใช้วิธีอื่นเพื่อประมวลผลข้อมูลใน POST อัปเดต ...

ใน Backbone source:

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

1

อีกตัวอย่างหนึ่งถ้าคุณใช้ Titanium Alloy:

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

1
โลหะผสมไทเทเนียมคืออะไร?
Neil

Alloy เป็นเฟรมเวิร์ก MVC สำหรับ Appcelerator Titanium SDK ( github.com/appcelerator/alloy )
peponline

-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);
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.