2012-03-31 12 views
10

Temelde ne gerek sorun className geçirilen işlevi de görünüm şablonunun html bağlamında yürütülür yani, buModel özniteliklerine dayanarak bir Backbone.js görünümü için bir sınıf adını nasıl dinamik olarak ayarlayabilirim?

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

böyle bir şey yapmak, bu yüzden this.model arayamam.

Model oluşturma işleminde bu noktaya erişebilmemin bir yolu var mı? Veya sınıfı daha sonra, örneğin render işlevinde ayarlamanız mı gerekiyor?

cevap

14

Bu model bağlama için bir iş gibi geliyor.

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 
    } 
2

this.$el.toggleClass'u kullanmayı veya render'un içine girmeyi çok daha kolay buluyorum. Eğer görünümü oluştururken sınıfını ayarlamak isterseniz

Ancak, bir seçenek olarak iletebilirsiniz:

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

Sen nitelikleri karma/işlevini kullanmalısınız:

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

Hayır'ı, bu doğru değildir. Bu "öznitelikler" işlevi _ensureElement() yönteminde gerçekleştirilir ve bu noktada buna erişemezsiniz.model –

İlgili konular