在 backbone.js 中传递事件的视图上下文

Passing context of view on event in backbone.js

我的 Backbone 视图存在上下文问题/设计问题。

目标

  1. 用户在单独的视图中从列表/用户集合中选择了一个用户。

  2. 上述视图传递了 editUserView 接收到的全局事件 ("edit-contact")。

  3. editUserView 应接收此事件并提取(用户)model.id 属性。通过使用此 model.id 我想使用从现有视图模型 Tsms.Collection.Users.

  4. 检索到的相应对象更新视图

问题

传递给 updateView 函数的上下文是错误的,因此我无法访问父视图 .render() 函数。调试器状态 "render() is not a function".

由于上下文不是父视图的上下文,我也无法设置 this.current 变量。

我该如何解决这个问题?

查看代码

Tsms.Views.editUserView = Backbone.View.extend({
    model: Tsms.Collections.Users,
    initialize: function(options) {
        Tsms.require_template('edituser')
        this.template = _.template($('#template_edituser').html());
        this.current = -1;

        Tsms.vent.on('edit-contact', this.updateView)
    },
    updateView: function(model) {
        this.current = model.id;
        this.render();
    },
    render: function() {
        this.$el.html(this.template(this.model.get(this.current).attributes));
        return this;
    }
});

Backbone's on 实际上需要三个参数:

on object.on(event, callback, [context])
[...]

To supply a context value for this when the callback is invoked, pass the optional last argument: model.on('change', this.render, this) or model.on({change: this.render}, this).

解决您问题的最简单且(当前)最惯用的方法是使用第三个 context 参数:

Tsms.vent.on('edit-contact', this.updateView, this);

同时 is right, you should use Backbone's listenTo to avoid memory leaks(僵尸视图)。

this.listenTo(Tsms.vent, 'edit-contact', this.updateView);

上下文自动设置为this,调用视图。

remove is called on the view, stopListening 被调用并且为事件保留的任何引用被删除时。

避免on的另一个原因是它应该是负责它想要处理的事件的视图,事件总线不应该知道。