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