1

我想说“当question_number更改时,运行updateQuestionNumber。如果有任何东西question_number(以及我提供自定义渲染函数的任何其他内容),运行 .render()”。

以下代码的问题是两者都运行updateQuestionNumberrender

v.QuestionBuilder = Backbone.View.extend({
    initialize: function() {
        this.model.on('change:question_number', this.updateQuestionNumber, this);
        this.model.on('change', this.render, this);
    },
    //only this function should run when question_number is changed
    updateQuestionNumber: function(){
        this.$('.question-number').text(this.model.get('question_number'));
    },
    //this should run when anything except question_number is changed
    render: function() {
        this.$el.html(this.template(this.model.toJSON()));
        this.$el.fadeIn('slow');

        /* blah blah blah */
        return this;
    }
});
4

2 回答 2

0

这是我能想到的最佳解决方案:

当 this.render() 触发时,我设置了一个数组 non_render 的属性,这些属性不需要完全渲染(由 处理this.model.on('change:whatever', this.whateverRenderFunction, this);)。然后它检查 changedAttributes。如果其中有任何不在 non_render ( ._difference) 中的内容,那么它会继续。否则返回。

不过,这似乎是一个超级庞大的解决方案(而且我必须维护 ininitialize和 in 中的 non_render 列表render。任何改进都会很棒......

    render: function(model, value, options){
        if(model){ //this was triggered via .change()
            var changed = _.keys(model.changedAttributes());
            var non_render = ['question_number'];

            //if there is anything in changed that's not part of non_render
            if(_.difference(changed, non_render).length === 0){
                return false;
            }
        }

        var data = this.model.toJSON();
        _.extend(data, _.result(this.templateProperties));

        this.$el.html(this.template(data));
    }
于 2012-12-21T21:05:53.100 回答
0
initialize: function() {
    this.model.on('change', function(model) {
        var changed = model.getChanged();
        if(changed && 1 === changed.length && changed.question_number) {
            this.updateQuestionNumber();
        } else {
            this.render()
        }
    }, this);
},
于 2012-12-21T21:25:58.003 回答