骨干视图 - 跨组件通信

时间:2016-10-18 03:32:35

标签: javascript backbone.js underscore.js backbone-views backbone-events

var BaseView = Backbone.View.extends({
});
var ComponentView = BaseView.extends({
});
var ChildView1 = ComponentView.extends({
});
var ChileView2 = ComponentView.extends({
});

我想在ChildView1ChileView2.

之间进行跨组件通信

我希望a _.extend({}, Backbone.Events)中有parent(ComponentView)个obj。

我在一些例子中看到了类似下面的内容

var ComponentView = BaseView.extends(_.extend({}, Backbone.Events, {
});

PS:我正在使用组件上的属性

初始化来自另一个BackboneView的所有组件

1 个答案:

答案 0 :(得分:2)

在Backbone中,我更喜欢使用某种发布/订阅事件模式来在视图之间进行通信。在其中最简单的形式中,您的代码将如下所示:

/* Create an Event Aggregator for our Pub/Sub */
var eventAggregator = _.extend({}, Backbone.Events);

/* Pass that Event Aggregator to our Child Views */
var childView1 = new ChildView1({ "eventAggregator": eventAggregator });

/* From here we can just bind/trigger off of eventAggregator whenever we need */
eventAggregator.bind("tellChild", function(e) { alert(e.message); });
eventAggregator.trigger("tellChild", { "message": "hello" });

注意我们如何创建一个新的对象,该对象延伸到内置的Backbone.Events并将其传递给ChildView1。在ChildView内部或其他任何引用eventAggregator的地方,您可以绑定/触发新事件。然而,这是冰山一角,因为您将不再需要知道此事件处理程序,解除事件处理程序的绑定并确保您不会泄漏内存。

这里没有足够的空间深入研究,所以我建议您阅读更多有关Backbone中事件聚合的内容。我所使用的所有逻辑都源于Derick Bailey在blog posts和他的书#34; Building Backbone Plugins"中所写的作品。 (两者都是卓越的信息来源)。这些最终来自他创作Marionette的工作,这是对Backbone的一个很好的称赞。如果您不想担心这些问题或只是想要一个更简单的API,我建议使用Marionette或类似的东西来改善您的Backbone Views。