2

更有效的是,使用事件在嵌套视图之间进行通信,或者保持引用以调用方法。以下示例显示了两个视图。外部 View 响应单击事件,然后可以使用事件或方法调用来使 InnerView 做出适当的响应。

InnerView = Backbone.View.extend({

    initialize: function() {
        this.model.bind('doSomethingEvent', this.doSomething);
    },

    doSomething: function() {
        // This could have been called from event/trigger
        // or from direction method invocation using reference.
    }
});


OuterView = Backbone.View.extend({

    events = {
        'click' : 'handleOutViewClick'
    },

    render: function() {

        // Create InnerView to render some model
        var innerView = new InnerView({model:this.model });

        $(this.el).append(innerView.render().el);

        // Could store a reference to the View?
        this.viewRef = innerView;
    },

    handleOutViewClick: function(e) {

        // Should this function use a reference to the InnerView instance:
        this.viewRef.doSomething();

        // Or should it trigger an event on this.model that 
        // the InnerView is bound to?
        this.someCollection.trigger('doSomethingEvent');
    }
});
4

1 回答 1

4

可能单个方法调用将比事件调度更有效,事件调度将涉及至少 2 个方法调用。但我认为你不需要关心技术上哪个更“有效”。除非这种情况在一秒钟内发生多次,否则您可以只关心如何使代码更清晰、更正确。我认为最简洁的模式取决于所传达的细节。这是我的偏好:

  1. 如果外部视图自然适合操作模型和集合,并通过正常的主干模型/集合事件让内部视图响应,那是最干净的。

  2. 如果发生的事情与模型无关,请考虑一种“视图模型”模式,在该模式中,您可以将视图的有趣状态位建模为后端模型,即使您无意让该模型交互与服务器。然后将你的两个视图绑定到来自视图模型的事件,并通过改变一个通用的“视图模型”实例来让它们协调。这是我用于复杂视图的模式,这些视图具有许多与服务器的底层模型没有直接关联的相互依赖的状态。

  3. 如果发生的事情并没有真正改变模型/集合并且更多的是特定于视图的事情,那么直接方法分派将更直接但也更紧密耦合。由事件分派提供的松散耦合何时值得额外的复杂性和更难遵循的控制流取决于您的判断。

于 2012-04-13T18:30:51.880 回答