Backbone:调用扩展视图的覆盖渲染()函数

Posted

技术标签:

【中文标题】Backbone:调用扩展视图的覆盖渲染()函数【英文标题】:Backbone: Call an extended view's overridden render() function 【发布时间】:2012-06-27 03:47:17 【问题描述】:

我有一个WorkoutExerciseRowView,它扩展了ExerciseRowView。渲染函数非常相似,除了WorkoutExerciseRowView 必须在ExerciseRowView 的渲染中添加一些参数。如何在WorkoutExerciseRowView的渲染函数中调用ExerciseRowView的渲染函数?

var WorkoutExerciseRowView = ExerciseRowView.extend(       
    render : function() 
        //return this.constructor.render( // doesn't work
        return this.render( // doesn't work
            workoutExercise : this.model,
            exercise : this.model.get("exercise"),
            workoutSection : this.model.get("section"),
            isEditable : true,
            number : this.number,
            WorkoutExercise : WorkoutExercise,
            WorkoutSection : WorkoutSection
        );
    
);

谢谢!

【问题讨论】:

【参考方案1】:
var WorkoutExerciseRowView = ExerciseRowView.extend(       
    render : function() 
        return ExerciseRowView.prototype.render.call(this,
            workoutExercise : this.model,
            exercise : this.model.get("exercise"),
            workoutSection : this.model.get("section"),
            isEditable : true,
            number : this.number,
            WorkoutExercise : WorkoutExercise,
            WorkoutSection : WorkoutSection
        );
    
);

来自 Backbone 的文档:http://backbonejs.org/#Model-extend

关于 super 的简要说明:javascript 没有提供简单的调用方式 super — 在原型上定义的同名函数 链。如果你重写了一个核心函数,比如 set 或 save,并且你想要 要调用父对象的实现,您必须 按照以下思路明确调用它:

Backbone.Model.prototype.set.call(this, attributes, options);

【讨论】:

【参考方案2】:

你应该可以使用

ExerciseRowView.prototype.render.call(this)

这将从ExerciseRowView调用渲染函数,范围设置为this(当前模型)

【讨论】:

【参考方案3】:
this.constructor.__super__.render.call(this,);

【讨论】:

根据github上的帖子,不应该使用super

以上是关于Backbone:调用扩展视图的覆盖渲染()函数的主要内容,如果未能解决你的问题,请参考以下文章

渲染 Backbone.js 集合

如何正确渲染 Backbone.js 视图

多次渲染时,Backbone 视图事件不起作用

渲染 Marionette/Backbone 视图时将变量传递到 Handlebars 模板

Backbone - 从子视图调用/引用父视图

Backbone 中的模型更改渲染