Как я могу динамически установить className для представления Backbone.js на основе его атрибутов модели?

В основном мне нужно сделать что-то вроде этого

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

Проблема заключается в том, что в функции, переданной в className, выполняется в контексте html шаблона представления, поэтому я не могу позвонить this.model.

Есть ли способ получить доступ к модели на этом этапе процесса рендеринга? Или мне нужно установить класс позже, например, в функции render?

Ответ 1

Это звучит как задание для привязки к модели.

App.CommentView = Backbone.View.extend({
  initialize: function () {
      // anytime the model 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
  }

Ответ 2

Вы должны использовать атрибуты hash/function:

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

Ответ 3

Было бы намного проще использовать this.$el.toggleClass или просто добавить класс внутри render.

Однако, если вы хотите установить класс при создании представления, вы можете передать его в качестве опции:

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