2014-12-04 3 views
2

Я все еще смущен этим. Общая парадигма Я вижу всплывать это ...

view.render() 

С рендер установлен

function() { this.$el.html(this.template()) } 

Как это поведение сетки с Вытащите? Это отображает представление .. но тогда логически вы вызовете .remove(), чтобы развязать события и вытолкнуть их. Если вы используете это, вы отбросили родительский контейнер ($ el) и не сможете повторно отобразить. Документы должны быть явными, тогда соглашение должно состоять не в this.$el.html(this.template()), а в том, чтобы отобразить шаблон, вызвав .html() на некотором не-el родительском элементе. Вы можете либо вызвать .render(), используя представления own $ el, а также использовать .remove().

Как эти два человека работают вместе?

+0

Также посмотрите на [backbone.marionette] (http://marionettejs.com/), у которого есть много вещей из коробки для вас и вашей проблемы. Он управляет такими вещами, как удаление элементов/разворачивание событий/перерисовка/.... Если вы вынуждены использовать только магистраль, вы можете увидеть, какой подход они используют для вашей проблемы. –

ответ

0

Я не думаю, что полностью понимаю ваши вопросы; но я думаю, что если вы посмотрите на разделы под названием:

Отделить Просмотры из других элементов DOM

и

очистки: Как избежать утечек памяти и привидения Просмотров

форму по следующей ссылке, то вы может просто найти ответ, который вы искали.

http://coenraets.org/blog/2012/01/backbone-js-lessons-learned-and-improved-sample-app/

Это было только до недавнего времени, что я начал добавлять свой взгляд на DOM снаружи самого представления, означающего не проходят в эл: при создании представления. Я просто хочу, чтобы он отображал элемент DOM из представления в память и вызывал render(). $ El из вызывающего кода, чтобы визуализировать представление так же, как в статье.

3

Лучшая практика, которую я вижу, несколько отличается. Оставьте объект el полностью - позвольте позвоночнику создать свой собственный элемент. Метод render должен выглядеть следующим образом:

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

, а затем вы называете render от маршрутизатора, таким образом:

some_container.append(view.render().el) 

Если вы делаете это таким образом, то реализация по умолчанию remove:

remove: function() { 
    this.$el.remove(); 
    this.stopListening(); 
    return this; 
} 

начинает иметь больше смысла. Представление создано и имеет единственный контроль над его el, поэтому имеет смысл разобраться в том, как уничтожить el, когда он уничтожается. Владелец представления создает представление и добавляет его на страницу; то позже владелец представления разрушает представление (путем вызова remove), когда владелец будет с ним выполнен. Такой подход делает вид хорошо самодостаточным.

Конечно, если ваш взгляд ожидает привязки к существующему el или кто-то дать ему el, когда он будет создан, то вы будете иметь, чтобы предоставить пользовательские remove развязывать DOM события (по телефону this.undelegateEvents() предположительно), удалите содержимое this.el (но не el) и т. д.Точно так же, если ваше представление имеет дочерние представления, вы должны предоставить remove, который будет называть remove всем детям перед очисткой.

+0

Это должно быть в документах. Это точно, что я ищу. Благодарю. Я не уверен, что я пропустил, но я прочитал две книги и официальные документы, и я не вижу, чтобы кто-то говорил. * Кроме того, вы разрешаете создавать представление и владеете его собственным el. * Или, 'some_container.append (view.render(). el) 'google for' this. $ el.html (this.template()) '- здесь много путаницы. –

+0

Вы вызываете 'some_container.append (view.render(). El)' в представлении или маршрутизаторе? –

+0

Это на самом деле не работает. Вы не можете привязывать события к элементу, который не существует при создании экземпляра. –

Смежные вопросы