2013-10-26 17 views
9

Ho cercato di passare un oggetto modello da valutare nel mio modello ma non ho avuto fortuna. Ho provato quanto segue, ma non ha avuto fortunapassare l'oggetto modello da visualizzare sul backbone

dashboardmodel.js

var myMod = Backbone.Model.extend({ 
    defaults: { 
    name: "mo", 
    age: "10" 
    } 
}); 

myview.js

  var dashView = Backbone.View.extend({ 

     el: '.content-area', 

     this.mymodel = new myMod({}), 

     template: _.template(dashBoardTemplate, this.mymodel), 
     initialize: function() { 
        }, 

        render: function() { 
         this.$el.html(this.template); 
         return this; 
        } 

// more javascript code............. 

dahboard.html

<p> Hello <%= name %> </p> 

PS: Sto usando il modello di sottolineatura motore

+0

Basta modificare il modello per renderlo scollegabile e nella funzione di rendering passare model.toJSON() o model.attributes, non passare il modello stesso. [BACKBONE DOCS] (http://backbonejs.org/#View-template) –

risposta

3

È necessario ottenere propertis di un modello Bacbone con la sintassi getter, quindi è necessario riscrivere il modello a:

<p> Hello <%= obj.get('name') %> </p> 

Oppure è necessario convertire il modello in un oggetto JS pianura al momento della chiamata _.template cosa si può fare con la .toJSON() (che crea un clone del modello) o .attributes immobili:

template: _.template(dashBoardTemplate, this.mymodel.toJSON()) 

SideNote: si dovrebbe considerare di spostare la logica di rendering modello nel vostro punto di vista. Poiché il codice corrente esegue il rendering del modello quando viene dichiarata la tua vista e non quando chiami il metodo render. Quindi puoi ottenere un risultato inaspettato. Quindi, il codice si guarda in questo modo:

template: _.template(dashBoardTemplate), //only compile the template 
render: function() { 
    this.$el.html(this.template(this.mymodel.toJSON())); 
    return this; 
} 
+0

Questo è fantastico! Grazie, il secondo approccio ha funzionato come un fascino – tawheed

5

Inoltre, il vostro modo di passare un modello per una vista non è flessibile, perché si dovrebbe passare un'istanza del modello, invece di un modello predefinito. Così, si potrebbe desiderare di individuare

this.mymodel = new myMod({}), 

(btw, sopra la linea mi dà messaggio di errore nel mio browser Chrome a causa del segno "=")

Quindi, si supponga di avere un'istanza A:

A = new myMod({"name": "World", "age":100}) 

poi passarlo alla vista come:

myview = new dashView({mymodel: A}) 

un altro passo, quello che dovete fare è quello di chiamare la funzione di rendering :

myview.render(); 

Ecco una soluzione completa:

<html> 
<script src="jquery-1.10.2.min.js"></script> 
<script src="underscore-min.js"></script> 
<script src="backbone.js"></script> 
<body> 
<script type="text/template" id="dashBoardTemplate"> 
<p> Hello <%= name %> </p> 
</script> 
<div class="content-area"> 
</div> 
<script type="text/javascript"> 
var myMod = Backbone.Model.extend({ 
    defaults: { 
    name: "mo", 
    age: "10" 
    } 
}); 

var dashView = Backbone.View.extend({ 
    el: '.content-area', 
    template: _.template($("#dashBoardTemplate").html()), 
    render: function() { 
     this.$el.html(this.template(this.model.toJSON())); 
     return this; 
    } 
}); 
mymod = new myMod({"name": "World", "age":100}); 
myview = new dashView({model:mymod}); 
myview.render(); 
</script> 
</body> 
</html> 

Se si vuole studiare backone.js, si prega di leggere questo libro open source che fatemi:

http://addyosmani.github.io/backbone-fundamentals/

Problemi correlati