2013-03-08 6 views
11

Sto tentando di eseguire il rendering di una raccolta backbone su un modello creato con mustache.js. Il problema è che non ho potuto ottenere il cid del modello nel modello. Il mio codice ènon è in grado di ottenere il cid del modello durante il rendering di una raccolta backbone su un modello

 <div class="phone span4"> 
      <h5> Phone Appointments</h5> 
      {{ _.each(slots, function(slot) { }} 
       {{ if(slot.aptType == "P"){ }} 
        <h6 cid="{{=slot.cid}}" aptId="{{=slot.aptId}}"> {{=slot.beginTime}} - {{=slot.endTime}} </h6> 
       {{ } }} 
      {{ }); }} 
     </div> 

dal codice precedente, posso ottenere aptId, beginTime e end Time, ma non il Cid. Come ottenere il Cid del modello da una raccolta durante il rendering su un modello?

e il mio metodo di rendere dal punto di vista assomiglia a questo

render:function(){ 
    var template = _.template($("#slot-display-template").html()); 
    compiledTmp = template({slots: this.collection.toJSON()}) 
    this.$el.append(compiledTmp); 
    } 

Inoltre v'è alcun svantaggio di utilizzare cid come identificatore univoco di un modello?

Grazie in anticipo !!!

+0

Perché hai bisogno che il cid sia nell'html? Se hai l'id del modello (sembra che aptId sia idAttribute?), Puoi trovarlo nella collezione, 'collection.get (modelId)'. –

risposta

22

Il cid non è incluso per impostazione predefinita nell'output toJSON. Sarà necessario eseguire l'override di toJSON nella definizione del modello e includere cid.

toJSON: function() { 
    var json = Backbone.Model.prototype.toJSON.apply(this, arguments); 
    json.cid = this.cid; 
    return json; 
} 
+0

In ogni caso è abbastanza strano che non ci sia un modo nativo (una bandiera?) Per mostrare "cid" all'interno del modello. – xdemocle

+0

questo è ridicolo, ingrandito –

1

Se avete bisogno di una soluzione ad vino del Reno, questo dovrebbe funzionare anche:

var params = _.extend({}, this.model.toJSON(), {cid: this.model.cid}) 
1

A proposito, se non è necessario estendere il comportamento di tutti i modelli si può semplicemente aggiungere cid al modello utilizzando il metodo parse. Ad esempio hai la collezione 'Collection'. È possibile specificare il modello per questa raccolta e sovrascrivere il metodo parse per allegare il modello cid alla risposta.

var Collection = Backbone.Collection.extend({ 
    model: Model 
}); 

var Model = Backbone.Model.extend({ 
    parse: function(response) { 
     response.cid = this.cid; 
     return response; 
    } 
}); 

Così sarete in grado di ottenere cid dagli attributi del modello.