Я называю пространство имен похожим на то, что вы делаете (по крайней мере, для части классов), и все мои модели, представления и контроллеры выглядят так:
просмотров / blocks.js:
(function(cn){
cn.classes.views.blocks = cn.classes.views.base.extend({
events: {},
blocksTemplate: cn.helpers.loadTemplate('tmpl_page_blocks'),
initialize: function(){
},
render: function(){
$(this.el).html(this.blocksTemplate());
},
registerEvents: function(){},
unregisterEvents: function(){}
});
})(companyname);
Мое пространство имен JavaScript выглядит следующим образом, хотя я улучшаю его каждый раз, когда создаю новое приложение:
companyname:{
$: function(){}, <== Shortcut reference to document.getElementById
appView: {}, <== Reference to instantiated AppView class.
classes = { <== Namespace for all custom Backbone classes.
views : {},
models : {},
collections: {},
controllers : {},
Router: null
},
models: {}, <== Instantiated models.
controllers: {}, <== Instantiated controllers.
router: {}, <== Instantiated routers.
helpers: {}, <== Reusable helper platform methods.
currentView: {}, <== A reference to the current view so that we can destroy it.
init: function(){} <== Bootstrap code, starts the app.
}
Все, что я хочу, чтобы все мои виды имели, я помещаю в базовый вид. Мой контроллер будет вызывать registerEvents
для любого нового представления, которое он создает (после рендеринга), и unregisterEvents
для представления непосредственно перед тем, как его убить. Не у всех представлений есть эти два дополнительных метода, поэтому он сначала проверяет существование.
Не забывайте, что все представления имеют встроенный this.el.remove();
, который не только убивает элемент контейнера представлений, но и отменяет привязку всех событий, связанных с ним. В зависимости от того, как вы создаете свои представления через контроллер, вы можете не захотеть убивать элемент и вместо этого сделать this.el.unbind (), чтобы отменить привязку всех событий.