¿Cómo puedo establecer dinámicamente un className para una vista de Backbone.js en function de sus attributes de model?

Básicamente lo que necesito es hacer algo como esto

App.CommentView = Backbone.View.extend({ className: function() { if (this.model.get('parent_id')) { return 'comment comment-reply'; } else { return 'comment'; } }, 

El problema es que en la function pasada a className se ejecuta en el context del html de la plantilla de vista, por lo que no puedo llamar a this.model .

¿Hay alguna forma de que pueda acceder al model en este punto del process de renderizado? ¿O necesito configurar la class más tarde, por ejemplo en la function de render ?

Esto suena como un trabajo para la encuadernación del model.

 App.CommentView = Backbone.View.extend({ initialize: function () { // anytime the model's name attribute changes this.listenTo(this.model, 'change:name', function (name) { if (name === 'hi') { this.$el.addClass('hi'); } else if...... }); }, render: function () { // do initial dynamic class set here } 

Debe usar los attributes hash / function:

 attributes: function () { //GET CLASS NAME FROM MODEL return { 'class' : this.getClass() } }, getClass: function() { return this.model.get('classname') } 

Sería mucho más fácil, creo que usar this.$el.toggleClass o simplemente agregar la class dentro de render .

Sin embargo, si desea configurar la class al build la vista, puede pasarla como una opción:

 view = new App.CommentView({ model: model, className: model.get('parent_id') ? 'comment comment-reply' : 'comment' })