2012-04-21 20 views
11

Ho bisogno di eseguire il rendering degli attributi di un modello su JSON in modo da poterli passare in un modello. Ecco cosa una funzione render() per una vista assomiglia:Il modello Backbone .toJSON() non esegue il rendering di tutti gli attributi su JSON

render: function() { 
    console.log(this.model); 
    console.log(this.model.toJSON()); 
    $(this.el).html(this.template(this.model.toJSON())); 
    return this; 
}, 

Ecco l'output attributi dopo aver fatto console.log (this.model):

created_at: "2012-04-19" 
id: "29" 
name: "item" 
resource_uri: "/api/v1/item/29/" 
updated_at: "2012-04-21" 
user: "/api/v1/user/9/" 

Ecco JSON del modello output dopo aver fatto console.log (this.model.toJSON()):

id: "29" 
__proto__: Object 

Che cosa è successo?

Edit: Ecco l'istanza:

var goal = new Goal({id: id}); 
    goal.fetch(); 
    var goalFullView = new GoalFullView({ 
    model: goal, 
    }); 

Ecco il contenuto della nuova vista:

console.log(this.model.attributes); 
    console.log(this.model.toJSON()); 

Ecco cosa dice la console:

Object 
created_at: "2012-04-23" 
id: "32" 
name: "test" 
resource_uri: "/api/v1/goal/32/" 
updated_at: "2012-04-23" 
user: "/api/v1/user/9/" 
__proto__: Object 

Object 
id: "32" 
name: "test" 
__proto__: Object 

Se il toJSON dovrebbe fare un clone degli attributi, perché non copia il nome corretto o perché non copia i campi created_at, updated_at?

Edit 2: Ecco il modello:

var Goal = Backbone.Model.extend({ 

    // Default attributes for Goal 
    defaults: { 
     name: "empty goal", 
    }, 

    // Check that the user entered a goal 
    validate: function(attrs) { 
     if (!attrs.name) { 
     return "name is blank"; 
     } 
    }, 

    // Do HTTP requests on this endpoint 
    url: function() { 
     if (this.isNew()) { 
     return API_URL + "goal/" + this.get("id") + FORMAT_JSON; 
     } 
     return API_URL + "goal/" + FORMAT_JSON; 
     //API_URL + "goal" + FORMAT_JSON, 
    }, 
    }); 

Edit 3: ho capito che ho bisogno di usare il callback successo da prendere per rendere una vista che utilizza il modello:

goal.fetch ({success: function (model) { var goalFullView = new GoalFullView ({ modello: goal, }); }});

+0

può mostrare il modello e la sua esemplificazione come bene? – mindandmedia

+0

Hai qualcos'altro nel codice che rende invisibili gli altri attributi per toJSON(), forse guarda il tuo Modello o incolla, come lo stai inizializzando ... vedi [jsfiddle] (http://jsfiddle.net/drinchev/ JLfJB/1 /) – drinchev

+0

Ho modificato il post originale con la classe Model. Non riesco a capire perché il toJSON non funzioni. Anche se questo.model.attributes stampa l'elenco corretto di attributi, quando provo a eseguire this.model.get ("id") o uno degli altri attributi, vengono visualizzati come vuoti. Chiaramente, è presente quando chiamo gli attributi sull'istanza del modello, però. – egidra

risposta

27

Il metodo toJSON() restituisce appena un clone superficiale della proprietà attributes del modello.

Dal annotated Backbone.js source:

toJSON: function(options) { 
    return _.clone(this.attributes); 
} 

Senza vedere più del vostro codice, sembra che si impostano direttamente le proprietà sull'oggetto del modello, piuttosto che utilizzare la funzione set per impostare gli attributi del modello.

I.e. non fare questo:

model.name = "item"; 

fare questo:

model.set("name", "item"); 

EDIT:

Per il vostro problema specifico, è possibile che si chiama toJSON prima che il modello aveva carico finito dal server.

E.g.Questo non funziona sempre come previsto:

var model = new Goal({id: 123}); 
model.fetch(); 
console.log(model.toJSON()); 

Ma questo sarà:

var model = new Goal({id: 123}); 
model.fetch({ 
    success: function() { 
    console.log(model.toJSON()); 
    } 
}); 
+1

Anche i documenti backbone indicano> La proprietà attributes è l'hash interno che contiene lo stato del modello. Utilizzare set per aggiornare gli attributi invece di modificarli direttamente. Se desideri recuperare e munge una copia degli attributi del modello, usa invece toJSON. – Trevor

+3

Sintassi set alternativo: 'model.set ({nome:" elemento "})' - questo modulo consente di impostare molte proprietà contemporaneamente. – stusmith

Problemi correlati