Hier ist eine Lösung durch Überschreiben der sync
-Methode, die ich verwenden, um Dateiuploads zu ermöglichen.
In diesem Fall überschreibe ich die sync
Methode des Modells, aber dies kann auch die Backbone.sync
Methode sein.
var FileModel = Backbone.Model.extend({
urlRoot: CMS_ADMIN_URL + '/config/files',
sync: function(method, model, options){
// Post data as FormData object on create to allow file upload
if(method == 'create'){
var formData = new FormData();
// Loop over model attributes and append to formData
_.each(model.attributes, function(value, key){
formData.append(key, value);
});
// Set processData and contentType to false so data is sent as FormData
_.defaults(options || (options = {}), {
data: formData,
processData: false,
contentType: false
});
}
return Backbone.sync.call(this, method, model, options);
}
});
EDIT:
Um Upload-Fortschritt zu verfolgen, können Sie eine xhr
Option Optionen hinzufügen:
...
_.defaults(options || (options = {}), {
data: formData,
processData: false,
contentType: false
xhr: function(){
// get the native XmlHttpRequest object
var xhr = $.ajaxSettings.xhr();
// set the onprogress event handler
xhr.upload.onprogress = function(event) {
if (event.lengthComputable) {
console.log('%d%', (event.loaded/event.total) * 100);
// Trigger progress event on model for view updates
model.trigger('progress', (event.loaded/event.total) * 100);
}
};
// set the onload event handler
xhr.upload.onload = function(){
console.log('complete');
model.trigger('progress', 100);
};
// return the customized object
return xhr;
}
});
...
Sie können außer Kraft setzen [ 'sync'] (http://backbonejs.org/#Sync) global, pro-Modell oder pro-Sammlung an den Server, wie Sie wollen reden. –
Hey, dein Vorschlag war der Ansatz, mit dem ich ging. Fühlen Sie sich frei, das als Antwort einzureichen, und ich werde es genehmigen. – Leonidas