2011-10-25 8 views
22

Mam model Post and collection Posts. I chcesz utworzyć formularz z listą wszystkich postów w <select id="multi" multiple="multiple">. Więc muszę zrobić renderowanie PostView wewnątrz mojego #multi z tym właśnie szablonem:Backbone.js wyłącza zawijanie przez div w renderowaniu

<option value=""><%= title %></option> 

Ale w końcu dostaję to zapakowany z div. Czy istnieje jakieś rozwiązanie, aby nie zawinąć tego szablonu za pomocą <div>?

Odpowiedz

32

Jeśli nie zdefiniujesz el (lub tagName) dla widoku (w klasie lub podczas tworzenia), widok zostanie umieszczony wewnątrz znacznika div. http://documentcloud.github.com/backbone/#View-el

var PostView = Backbone.View.extend({ 
    tagName: 'option' 
}); 

UPDATE

Zaczynając v0.9.0, Backbone ma view.setElement (element), aby to zrobić.

var PostView = Backbone.View.extend({ 
    initialize: function() { 
     var template = _.template('<option value=""><%= title %></option>'); 
     var html = template({title: 'post'}); 
     this.setElement(html); 
    } 
}); 
+1

Próbowałem również tego podejścia, ale nie widzę sposobu przekazania zmiennej dla "wartości" wewnątrz tego znacznika

+0

Wewnątrz widoku możesz użyć jquery, aby ustawić wartość '$ (this.el) .attr ('value', 'something');' – kreek

+4

lub nawet 'this.el.value = 'something'' opuści jQuery gdzie to jest potrzebne :) –

18

Jeśli nie chcesz mieć widok owinąć HTML, musisz zrobić kilka rzeczy:

  1. Wymień this.el całkowicie
  2. połączenia delegateEvents na nowym el
render: function(){ 
    var html = "some foo"; 
    this.el = html; 
    this.delegateEvents(this.events); 
} 

Od Backbone generuje div lub inny znacznik (na podstawie ustawienia tagName dla widoku), należy go całkowicie zastąpić. To łatwe. Gdy to zrobisz, utracisz zadeklarowane zdarzenia, ponieważ Backbone używa pod kodem jQuery delegate, aby je połączyć. Aby ponownie włączyć zadeklarowane zdarzenia, zadzwoń pod numer delegateEvents i podaj deklaracje zdarzeń.

W rezultacie numer view.el będzie oznaczony jako <option> i nic poza tym.

+0

Bardzo dziękuję za pomoc, Derick. Posłużę się twoją radą w moich przyszłych projektach/ – BazZy

+0

nie musisz przekazywać this.events do delegateEvents, będzie to domyślne. – troynt

+8

jest na to funkcja w najnowszej wersji BB - [view.setElement (html)] (http://documentcloud.github.com/backbone/#View-setElement) – zihotki

Powiązane problemy