Search code examples
backbone.jsuser-interfacebindingviewmarionette

Availability of UI elements in Marionette.View


I'd just like to understand the decisions behind Backbone.Marionette's view regarding UI elements. When instantiating a Marionette.View on an existing DOM element, like this:

view = new Marionette.ItemView({
     el: "#element",
     ui : {
         whatever : "#whatever"
     }
});

I am able to access view.$el, the jquery selector inside view.initialize, so far so good. However, when I try to access view.ui.whatever, I only have access to the selector, ie the string "#whatever" instead of the actual $("#whatever") jquery selector.

The reason for this is because Marionette.View.bindUIElements() is only called on render and not before initialize.

I would like to know if you think this behaviour is logic and why?

I am only asking in the case of attaching of the view to an existing el, if the view is created with a template, I do understand why the binding is in render().


Solution

  • Attaching a view to an existing element is the exception. The normal view lifecycle involves calling render, and without doing that there would be nothing for the UI elements to bind to.

    Just call this.bindUIElements() in your initialize method when you need to attach a view to an existing element.