【问题标题】:Set dynamically className on Backbone view render在 Backbone 视图渲染上动态设置 className
【发布时间】:2013-08-22 06:11:21
【问题描述】:

我有一个 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没有用渲染重新计算...... 渲染视图时如何重新计算类名?

有人有想法吗? 谢谢

【问题讨论】:

    标签: backbone.js render classname


    【解决方案1】:

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

    _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'));
    }
    

    【讨论】:

    • 过度杀伤警报,您只需this.$el.addClass('classname') 即可显示视图。
    • 除非您做的事情比添加类更复杂(添加一些、切换一些等)。出于这个原因,它并不过分,它很强大。
    猜你喜欢
    • 1970-01-01
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-04
    • 1970-01-01
    相关资源
    最近更新 更多