2011-01-23 15 views
12

Estoy tratando de crear una lista de elementos (por ejemplo, libros) y me gustaría permitir que el usuario filtre esta lista (por ejemplo, por autor). Esperaría que cada elemento en la lista tuviera su propia vista, y que la lista también tuviera una vista. Sin embargo, no puedo "ver" cómo encajan en Backbone.¿Vistas dentro de las vistas? ¿Cómo generar listas de elementos con Backbone.js?

Actualmente, mi código es el siguiente (coffeescript):

class Book extends Backbone.Model 

class BookList extends Backbone.Collection 
    model: Book 
    url: "/library/books.json" 

books = new BookList 

class BookListView extends Backbone.View 
    initialize: -> 
    @template = _.template(''' 
     <ul> 
     <% books.each(function(book){ %> 
      <li><%= book.get('title') %>, <%= book.get('author') %></li> 
     <% }); %> 
     </ul> 
    ''') 
    @render 

    render: -> 
    template = @template 
    books.fetch success: -> jQuery("#books").html(template({'books': books})) 

Lo que me gustaría entender es cómo crear cada elemento <li> en la lista con su propio punto de vista + plantilla de modo que pueda filtrarlos por autor.

Respuesta

11

Mientras que es ciertamente posible escribir de esa manera, las cosas pueden ser complicado si tiene plantillas de vistas de anidación plantillas de anidación, ad infinitum ...

En su lugar, ¿por qué no insertar sus vistas de libreta en la lista:

render: -> 
    $(this.el).html this.template() 
    bookHTML = for book in Books 
    (new BookView model: book).render().el 
    this.$('.book_list').append bookHTML 
+0

Gracias! ¿Cómo se utilizarían los métodos 'filter' de Underscore para filtrar los libros por autor? –

+0

Además, ¿podría proporcionar un ejemplo de cómo se escribiría una plantilla anidando una vista anidando una plantilla? Solo en caso de que uno quiera realmente lograr esa estructura, más para fines de aprendizaje que para el uso real. :) –

+0

<%= renderTemplate(moreData) %>
jashkenas

Cuestiones relacionadas