Подтвердить что ты не робот

Backbone.js отключает обертку с помощью div в рендеринге

У меня есть сообщение о публикации и сборнике. И хотите создать форму со списком всех сообщений в <select id="multi" multiple="multiple">. Поэтому я должен сделать рендеринг PostView внутри своего #multi только с помощью этого шаблона:

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

Но, наконец, я получаю его завернутым в div. Есть ли какое-либо решение для не обтекания этого шаблона с помощью <div>?

4b9b3361

Ответ 1

Если вы не определяете el (или tagName) для представления (в классе или во время создания экземпляра), представление будет помещено внутри тега div. http://documentcloud.github.com/backbone/#View-el

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

UPDATE

Начиная с v0.9.0, Backbone имеет элемент view.setElement(element), чтобы сделать это.

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

Ответ 2

Если вы не хотите, чтобы представление обертывало ваш HTML, вам нужно сделать несколько вещей:

  • Заменить this.el полностью
  • Вызов delegateEvents в новом el
render: function(){
  var html = "some foo";
  this.el = html;
  this.delegateEvents(this.events);
}

Так как Backbone генерирует div или другой тег (на основе вашего параметра tagName для представления), вы должны его полностью заменить. Это легко сделать. Однако, когда вы это делаете, вы теряете объявленные события, потому что Backbone использует jQuery delegate под капотом, чтобы связать их. Чтобы снова включить объявленные события, вызовите delegateEvents и передайте объявления о событиях.

В результате ваш view.el будет тегом <option>, который вы хотите, и не более того.

Ответ 3

В версии 0.9.0 Backbone представила view.setElement(element) для обработки этой операции.