View.render()中的'this'被设置为模型

时间:2015-12-28 09:58:12

标签: javascript jquery backbone.js

我是Backbone.js的新手

我必须在这里做错事。我正在尝试做一个小小的演示,看看我可以用Backbone做些什么,并将其基于一些示例代码。

我得到“未捕获的TypeError:无法调用未定义的方法toJSON”。

我明白为什么会这样做,因为.bind("change", taskView.render)调用正在为模型设置上下文(警报确认),但似乎至少应该有一个参数来渲染函数来获取访问权限到了视野。也许我只是走错路? (参见下面的示例代码)。

task.bind("change", _.bind(taskView.render, taskView));

3 个答案:

答案 0 :(得分:0)

task.listenTo(model, 'change', taskView.render);

这表示听取模型更改并在每次更改时呈现taskView。

答案 1 :(得分:0)

正如irvani建议的那样,请改用listenTo

  

object.listenTo(other, event, callback)告诉对象在另一个对象上侦听特定事件。使用它的优点   form,而不是other.on(event,callback,object),就是listenTo   允许对象跟踪事件,并可以删除它们   以后一下子。 将始终使用object调用回调   作为背景

在你的情况下,

taskView.listenTo(task,"change",taskView.render);

假设taskView为Backbone.ViewtaskBackbone.Model

与使用listenTo相比,使用on时内存泄漏的可能性会更小。

如果您必须使用on,则可以将上下文指定为第三个参数,并且建议mu太短:

  

要在调用回调时为此提供上下文值,请传递可选的最后一个参数:model.on('change', this.render, this)model.on({change: this.render}, this)

在你的情况下:

task.on("change", taskView.render, taskView);

答案 2 :(得分:0)

在Backbone Views和Models上,'bind'的'this'上下文是调用对象,因此model.bind('change', ...) this是模型。对于view.bind(... this,将是视图。

您收到错误是因为task.bind("change", _.bind(taskView.render, taskView));this设置为渲染运行时的任务,但this实际上需要是taskView。

由于您希望将模型事件绑定到视图,正如irvani所建议的,最好的方法是使用.listenTo方法(请参阅:http://backbonejs.org/#Events-listenTo

taskView.listenTo(task, 'change', taskView.render);

根据您希望视图生命周期的工作方式,您还可以将代码放在视图的initialize方法中,该方法在创建视图时执行。然后在stopListening方法中使用remove,以便在视图不再使用时清除侦听器。

当任务模型传递到视图中时,你会得到一个相当整洁的:

AskView = Backbone.Model.extend({
    initialize: function(){
        this.listenTo(this.model, 'change', this.render);
    },
    ...
    remove: function(){
        this.stopListening(this.model);
        ...
    }
 });

 var askView = new AskView({ model: task });

但是,问题的一线解决方案是:

 task.on("change", taskView.render, taskView);

bind只是on的别名(请参阅:http://backbonejs.org/#Events-on)。第一个参数是您正在侦听的事件,第二个参数是要触发的方法,第三个参数是要绑定到的上下文,在本例中是您的taskView。