22

Ok Jungs so habe ich diese Reihe von Schlüsselpaar Werte, die ich als mein Modell bin mit:
Schleifen in Underscore.js template

var acs = [{'label':'input box'},{'label':'text area'}]; 

der Rest des Codes geht wie folgt

var Action = Backbone.Model.extend({}); 
var action = new Action(acs); 
var ActionView = Backbone.View.extend({ 
    tagName:"li", 
    template: _.template($('#actions-template').html()), 
    events:{ 
     "click":"makeInput" 
    }, 
    render:function(){ 
     $(this.el).html(this.template(this.model.toJSON())); 
     $(".hero-unit>ul").append(this.el); 
     return this; 
    }, 
    makeInput:function(){ 
     alert("im in"); 
    } 
}); 
var actionView = new ActionView({model:action}); 
actionView.render(); 

Die Frage ist in Bezug auf die Ansicht. Wie kann ich Schleife durch das Modell, das ich, wenn dies vorbei bin ist die Ansicht, die ich

<script type="text/template" id="actions-template"> 
<% _.each(action, function(acs) { %> 
    <a class="btn"><%= label %></a> 
<% }); %> 
</script> 

Es ist etwas falsch mit meiner Ansicht und der Schleife ich glaube, haben will. Irgendwelche Hinweise? Danke!

+0

http://stackoverflow.com/questions/4778881/how-to-use-underscore-js-as-a-template-engine hat auch einige Lösungen. – Pramod

Antwort

28

Sie wahrscheinlich zwei Dinge tun wollen würde:

  1. die Daten, die Sie auf die Vorlage liefern Passen:

    $(this.el).html(this.template({ 
        action: this.model.toJSON() 
    })); 
    
  2. den inneren Teil der Vorlage anpassen acs.label verwenden statt label:

    <a class="btn"><%= acs.label %></a> 
    

Demo: http://jsfiddle.net/ambiguous/xczBy/

Auf den zweiten Gedanken, ich denke, Sie sollten mit einer Sammlung und nicht mit einem einzelnen Modell arbeiten. Sie würden wollen, dass diese hinzufügen:

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

Und dann render einstellen this.collection verwenden:

$(this.el).html(this.template({ 
     actions: this.collection.toJSON() 
    })); 

Und dann beginnen die Dinge so:

var actions = new ActionCollection(acs); 
var actionView = new ActionView({collection: actions}); 

Und schließlich beziehen sich auf actions in der Vorlage:

<% _.each(actions, function(acs) { %> 

Demo: http://jsfiddle.net/ambiguous/6VeXk/

Dies würde Backbones Schlüssel/Wert-basierten Modellen besser entsprechen.

+0

ja! Vielen Dank – climboid

+0

eine kleine Frage, warum ist es Aktion: this.model.toJSON()? – climboid

+1

@ climboid: Ihr Modell war ein Array (das im Backbone ungerade ist) und Sie müssen ihm einen Namen geben oder die Vorlage wird nicht darauf verweisen können. Modelle sind normalerweise Sätze von Schlüssel/Wert-Paaren (mehr oder weniger), so dass die Werte standardmäßig Namen erhalten. Zu einer Sammlung zu wechseln (wie in meiner aktualisierten Antwort) würde mehr Sinn machen. –

Verwandte Themen