Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Backbone.js 视图之间的事件处理_Backbone.js_Backbone Views_Backbone Events - Fatal编程技术网

Backbone.js 视图之间的事件处理

Backbone.js 视图之间的事件处理,backbone.js,backbone-views,backbone-events,Backbone.js,Backbone Views,Backbone Events,好的,我有一个这样的布局图: 屏幕上部的表格由以下内容组成: 消息列表视图 消息视图 AppView 我将很快在屏幕下部添加一个新视图(可能是“预览视图”) 当用户单击一行时,我希望在“预览视图”中发生一些事情。 例如,在PreviewView中显示其他模型的属性(例如详细信息)可能会很有趣 最佳做法是什么 在每个MessageView中保存对PreviewView的引用 在select方法内触发事件,并在预览视图内使用on()侦听事件 在我的模型中使用暂时的“selected”属性,并使P

好的,我有一个这样的布局图:

屏幕上部的表格由以下内容组成:

消息列表视图

消息视图

AppView

我将很快在屏幕下部添加一个新视图(可能是“预览视图”)

当用户单击一行时,我希望在“预览视图”中发生一些事情。

例如,在PreviewView中显示其他模型的属性(例如详细信息)可能会很有趣

最佳做法是什么

  • 在每个MessageView中保存对PreviewView的引用
  • 在select方法内触发事件,并在预览视图内使用on()侦听事件
  • 在我的模型中使用暂时的“selected”属性,并使PreviewView侦听集合“change”事件

谢谢,如果您需要更多详细信息,请告诉我,我将编辑此问题。

不确定最佳做法,但我发现此解决方案很难实现。我创建了一个全局消息传递对象bus,不管是什么:

window.App = {};
window.App.vent = _.extend({}, Backbone.Events);
您必须在先前创建的事件总线上注册PreviewView的“triggerable”函数(根据您的示例,这应该在
PreviewView
中):

现在,您应该能够通过调用:
App.vent.trigger
从应用程序中的任何位置触发任何已注册事件。例如,当用户单击一行时,您将看到类似的内容:

App.vent.trigger('PreviewView.show');
如果您必须随触发事件一起发送和发送对象,请使用:

App.vent.trigger('PreviewView.show', data);

好的,但是把选定的模型传递给它怎么样。PreviewView如何知道选择了集合上的哪个模型?也许我可以在事件总线上传递模型本身?当然,触发器也接受参数:App.vent.trigger('PreviewView.show',model);在您看来,最好让应用程序视图(顶层视图)不知道底层视图在做什么,并按照您的建议使用事件聚合器来保持所有视图的解耦。。。。或者在应用程序视图中包含集合和所有内容?我总是使用解耦视图,但这取决于您,耦合和解耦都有其优缺点。在解耦视图的情况下,您可以获得可读性,但在出现一般错误的情况下,您可能必须在每个视图中纠正相同的错误。最好的办法是尝试两种解决方案,坚持你最喜欢的一种。
window.App = {};
window.App.vent = _.extend({}, Backbone.Events);
initialize: function () {
    App.vent.on('PreviewView.show', this.show, this);
}
App.vent.trigger('PreviewView.show');
App.vent.trigger('PreviewView.show', data);