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

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

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?

Ответы [ 4 ]

14 голосов
/ 31 марта 2012

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

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
  }
3 голосов
/ 08 ноября 2012

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

attributes: function () {
 //GET CLASS NAME FROM MODEL
 return { 'class' : this.getClass() }
},
getClass: function() {
   return this.model.get('classname')
}
2 голосов
/ 31 марта 2012

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

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

view = new App.CommentView({
  model: model,
  className: model.get('parent_id') ? 'comment comment-reply' : 'comment'
})
0 голосов
/ 22 сентября 2018

Я сделал это при View initialize

App.CommentView = Backbone.View.extend({
    initialize: function() {
        if(this.model.get("parent_id"))
            this.$el.addClass("comment-reply");
    },
...