Как я могу динамически установить 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'
})