2013-04-30 11 views
11

Sono n00b in BackboneJS/RequireJS e sto sviluppando un'app Web che utilizza un'API RESTful. così ho un modello come questo:Backbone.js - Come salvare il modello per modulo e inviare al server

modelli/pet.js

define([ 
    'backbone' 
], function(Backbone){ 

var PetModel = Backbone.Model.extend({ 

    urlRoot: 'http://localhost:3000/pet', 
    idAttribute: '_id', 

    defaults: { 
     petId: "", 
     type: "", 
     name: "", 
     picture: "", 
     description: "", 
     breed: "", 
     size: "", 
     sex: "", 
     age: "", 
     adopted: false, 
    } 
}); 

    return PetModel; 
}); 

una collezione: collezioni/pets.js

define([ 
    'backbone', 
    'models/pet' 
], function(Backbone, PetModel){ 

    var PetsCollection = Backbone.Collection.extend({ 
    url: 'http://localhost:3000/pets', 
    model: PetModel, 
}); 

    return PetsCollection; 
}); 

e una vista che rende un modulo per aggiungere nuovi modelli (Forse è possibile un altro modo più elegante) visualizzazioni/petAddNew.js

define([ 
    'jquery', 
    'backbone', 
    'models/pet', 
    'collections/pets', 
    'text!templates/pet/addNew.html' 
], function($, Backbone, PetModel, PetsCollection, petAddNewTemplate){ 

var PetAddNewView = Backbone.View.extend({ 

    el: $('#formAdd'), 
    template: _.template(petAddNewTemplate), 

    events: { 
     'click #add'  : 'submitAdd', 
    }, 

    initialize: function() { 
     this.model = new PetModel(); 
     this.collection = new PetsCollection(); 
     _.bindAll(this, 'submitAdd'); 
    }, 

    render: function() { 
     var view = this; 
     view.$el.html(view.template); 
     return view; 
    }, 


    submitAdd: function(e) { 
     //Save Animal model to server data 
     e.preventDefault(); 
     var pet_data = JSON.stringify(this.getFormData(this.$el.find('form'))); 
     this.model.save(pet_data); 
     this.collection.add(this.model); 
     return false  
    }, 

    //Auxiliar function 
    getFormData: function(form) { 
     var unindexed_array = form.serializeArray(); 
     var indexed_array = {}; 

     $.map(unindexed_array, function(n, i){ 
      indexed_array[n['name']] = n['value']; 
     }); 

     return indexed_array; 
    }, 

}); 

return PetAddNewView; 
}); 

Così quando invio il modulo non invio alcun dato al server. Non so come aggiustarlo. Qualche idea? Grazie in anticipo!

+1

Perché non dovresti eseguire il debug di ciò che accade all'interno di Backbone? Nella maggior parte dei casi è il modo più veloce per risolvere i problemi (come con qualsiasi prodotto open source). –

+0

Sì, ho eseguito il debug con console.log in chrome e la variabile "pet_data" mostra l'oggetto JSON completo serializzato del modulo ma il metodo "save" non funziona :( –

+0

Grazie @ J-unior ho notato che non debug in server-side e ho già trovato il bug. Sono felice ora: P –

risposta

8

È necessario impostare prima gli attributi e quindi salvare.

//Auxiliar function 
getFormData: function(form) { 
    var self = this; 
    var unindexed_array = form.serializeArray(); 

    $.map(unindexed_array, function(n, i){ 
     self.model.set({ 
      n['name']: n['value'] 
     }); 
    }); 
} 

Ora this.model.save() funziona (risparmio sul lato server).

Si può vedere che funziona in un fiddle.

+0

può anche fare riferimento a http: // jsfiddle. net/nikoshr/4ArmM/ –

+0

C'è una parentesi in eccesso dopo 'n ['nome']'. –

+0

@BenjaminSullivan Ora è fissato. Ci sono voluti ~ 2 anni –

4

Model.save aspettarsi un oggetto/hash di nuovi valori, proprio come Model.set. Qui stai passando una stringa come argomento degli attributi.

+0

Ho provato "this.getFormData (this. $ el.find ('form')" invece di "JSON.stringify (this. getFormData (questo. $ el.find ('form'))); "per passare l'oggetto e non funziona neanche. –

+0

Grazie! @Simon Boudrias questa risposta mi aiuta :) –

Problemi correlati