在Backbone视图渲染上动态设置className

时间:2013-08-20 08:55:42

标签: backbone.js render classname

我有一个Backbone视图,其中className是使用函数动态设置的:

app.Views.ItemRequestView = Backbone.View.extend({

    tagName     : 'tr',

    className   : function(){

        var classRow = '';

        if(this.model.getState() == app.Models.Request.status.wait.key) {
            classRow = app.Models.Request.status.wait.color + ' bolder';
        }
        else if(this.model.getState() == app.Models.Request.status.confirm.key){
            classRow = app.Models.Request.status.confirm.color + ' bolder';
        }

        return classRow;
    },

当我更新视图模型时,我会触发一个渲染视图的更改事件。 问题是className不会重新计算渲染... 如何渲染视图时如何重新计算className?

有人有想法吗? 感谢

1 个答案:

答案 0 :(得分:8)

您必须在class方法后手动更新render。 Backbone仅在className方法中初始化视图元素的_ensureElement一次:

_ensureElement: function() {
      if (!this.el) {
        var attrs = _.extend({}, _.result(this, 'attributes'));
        if (this.id) attrs.id = _.result(this, 'id');
        if (this.className) attrs['class'] = _.result(this, 'className');
        var $el = Backbone.$('<' + _.result(this, 'tagName') + '>').attr(attrs);
        this.setElement($el, false);
      } else {
        this.setElement(_.result(this, 'el'), false);
      }
}

如果您看一下,它会检查元素是否已存在。 无论如何,您可以使用render方法手动执行此操作:

render: function(){
   //Your logic
   this.$el.attr('class', _.result(this, 'className'));
}