Я не вижу ни одного _this
, определенного где-либо, поэтому я ожидал бы, что все остановится, как только вы позвоните renderMap
, и это помешает вашим событиям что-либо делать.
Я вижу это:
MapModalView = Backbone.View.extend({
//...
_this: this,
, но это не создает _this
в области видимости объекта, а просто создает значение по умолчанию this._this
для экземпляров вашего представления;Более того, когда строится MapModalView, this
, вероятно, будет window
, поэтому все, что вы делаете, это даете каждому MapModalView ссылку на window
в this._this
.
Я думаю, что все ваши _this
ссылки должны быть this
, и, возможно, вы хотите добавить:
_.bindAll(this, 'renderMap, 'renderPin');
к методу MapModalView initialize
, чтобы эти два всегда имели право this
при вызове.
И теперь для основной проблемы теперь, когда у нас есть в основном функциональный код.
Магистральные представления имеют el
:
Все представлениявсегда иметь элемент DOM (свойство el), независимо от того, были ли они уже вставлены на страницу или нет.
и имеют $el
:
Кэшированный объект jQuery (или Zepto) для элемента представления.
Операторы метода delegateEvents
для this.$el
.Вы не указываете el
(или id
, tagName
, ...) как часть определения вашего представления, поэтому Backbone инициализирует ваш el
пустым <div>
, а затем инициализирует this.$el = $(this.el)
.Ваш конструктор изменится this.el
:
this.el = $('.modal_box');
, но вы ничего не сделаете с this.$el
, поэтому он по-прежнему ссылается на пустой <div>
.Помните, что delegateEvents
использует this.$el
, и это не указывает ни на что полезное, поэтому ваши события не привязываются ни к чему в DOM.
Если вы настаиваете на установке this.el
внутри вашего initialize
,тогда вам также нужно будет установить this.$el
:
initialize: function() {
this.el = '.modal_box';
this.$el = $(this.el);
//...
Демо: http://jsfiddle.net/ambiguous/D996h/
Или вы можете использовать setElement()
для установки el
и $el
для вас.
Обычный подход - установить el
как часть определения представления:
MapModalView = Backbone.View.extend({
el: '.modal_box',
//...
Демонстрация: http://jsfiddle.net/ambiguous/NasSN/
Или вы можете передать el
представлению при его создании:
m = new MapModalView({el: '.modal_box'});
m.render();
Демонстрация: http://jsfiddle.net/ambiguous/9rsdC/