Приводит меня в бешенство, взгляните на этот jsfiddle - это очень упрощенная версия моей проблемы, но это абсолютно демонстративно. Как это работает, но если вы удалите определение AppView
var AppView = Backbone.View.extend({
el: $("body"),
initialize: function() {
console.log('init');
this.render();
},
render: function() {
console.log('render');
this.$el.html("123");
}
});
из "основного" сценария (проверьте сами - то же определение будет по-прежнему включено в раздел "внешние ресурсы") - он перестает работать. Я попытался проверить с помощью console.log
если определение все еще доступно в глобальном пространстве имен, и, конечно же, это так. Не имеют ни малейшего представления о.
Обновить:
И даже больше - он не просто доступен - чертовски все работает, как мы можем, в консоли chrome для консоли console.log()
но this.$el.html("123");
ничего не влияют!
Если вы осмотрите нижнюю правую панель в вашей скрипке, вы можете увидеть, что AppView.js
файл включаются в head
сгенерированного документа, показанном в IFRAME. Вид определен с элементом el
установленным в $ ('body')
el: $ ("body")
Но body
Node
еще не существует: это пустой объект jQuery.
Внутри ready
обратного вызова document
jQuery
определение AppView находит элемент body, как вы ожидаете.
Я понимаю, что вам нужно переместить определение View в отдельный файл javascript. Вы можете достичь результата разными способами. Наиболее очевидным является включение элемента script
который импортирует его внутри элемента body. Лучше всего было бы установить el
в методе initialize
определения AppView
или, что еще лучше, вы могли бы передать элемент в конструктор, как объясняет Кенан в своем комментарии ниже.
el: $("body")
будет выполнено так рано!
var app = new AppView({el:$("body")});
var app = new AppView
заключается в наличииvar app = new AppView
и определенияAppView
. Вы спрашиваете, почему код не работает без определения иnew AppView
частиnew AppView
?AppView
как это - то же самое определение будет по-прежнему включено во внешний файл - посмотрите наexternal resources
в левой части страницы скрипки.