Backbone.js wird mit Parametern abgerufen


152

Nach der Dokumentation habe ich:

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

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

Die URL stellte sich heraus als: http://localhost:1273/Items?[object%20Object]

Ich hatte so etwas erwartet http://localhost:1273/Items?page=1

Wie übergebe ich Parameter in der Abrufmethode?


Das ist definitiv komisch. Wie Sie aussehen, sollte es basierend auf den API-Dokumenten einwandfrei funktionieren . Verwenden Sie die neueste Version von Backbone.js?
Matt Ball

Kannst du es versuchen JSON.stringify({ data: { page: 1} })?
Joe

@ Joe Tuskan, ich bin mir nicht sicher, was ich damit machen soll, aber ich habe es getan: collection.fetch(JSON.stringify({ data: { page: 1} }));und nichts wurde in der URL übergeben.
Shawn Mclean

Ok, mach das: collection.fetch ({data: JSON.stringify ({page: 1})});
Joe

3
Dies funktioniert gut, wie Sie es in Backbone 1.0 geschrieben haben fyi
Dominic

Antworten:


213

Ändern:

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

zu:

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

Ohne es zu übertreiben, wird dies mit Ihrem {data: {page:1}}Objekt als aufgerufenoptions

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);
};

Daher sendet es die 'Daten' an jQuery.ajax, das sein Bestes tut, um alles params.dataan die URL anzuhängen .


71

Sie können processData auch auf true setzen:

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

Jquery verarbeitet das Datenobjekt automatisch in eine Parameterzeichenfolge.

In der Funktion Backbone.sync deaktiviert Backbone die processData, da Backbone eine andere Methode zum Verarbeiten von Daten in POST, UPDATE ... verwendet.

in der Backbone-Quelle:

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);
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.