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?

Shawn Mclean
quelle
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 .

Joe
quelle
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;
}
Jimchao
quelle
1

Ein weiteres Beispiel für die Verwendung von Titanlegierung:

 collection.fetch({ 
     data: {
             where : JSON.stringify({
                page: 1
             })
           } 
      });
Peponline
quelle
1
Was ist eine Titanlegierung?
Neil
Alloy ist ein MVC-Framework für das 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);
}
Walter von Entferndt
quelle