相关的Backbone.js视图是否应该相互引用,或仅通过事件进行交谈?

aw *_*rud 12 javascript eventaggregator backbone.js

我有一个做CRUD的应用程序CollectionModels.DisplayView每个模型都有一个始终可见的模型.还有一个EditView仅在DisplayView单击关联时才可见.

DisplayViewEditView出现的不同意见父里面.现在我正在使用"事件聚合器"模式告诉我的应用程序渲染EditViewDisplayView单击a.此处描述的模式:http://lostechies.com/derickbailey/2011/07/19/references-routing-and-the-event-aggregator-coordinating-views-in-backbone-js/

当我DisplayView点击其中一个时,它会触发一个EditViews侦听父级的事件.当它收到此事件时,它会EditView根据触发事件的模型呈现适当的事件.

这适用于我的大多数应用程序,但是当我想EditView根据DisplayView我的应用程序中相关的绝对位置获得更改位置时,这特别麻烦.它不是DisplayView直接控制位置EditView,而是触发"请将自己重新定位到这些坐标"事件.这种直接通信并不像应该向整个应用程序广播的东西.我开始怀疑,对于我的情况,我应该只是引用适当的EditView作为每个属性DisplayView而不是将它们分离.

正如我所说,问题在于它们是在不同的父视图中呈现的.在DisplayViews得到呈现的HeaderView,而在EditViews得到呈现的ContentView.

其他人如何处理这样的情况?将EditView在某些方面属于DisplayView,但是,这并不符合我的应用程序的DOM的结构方式.假设我创建的每个之间的直接联系EditViewDisplayView,我将如何处理的显示/隐藏EditView?是否DisplayView还需要对ContentView容器的引用,它将使用适当EditView的参数显式呈现?

Ton*_*ony 15

尽你所能,绝对避免持有对并行视图的引用(与父/子视图相反)并相互修改的视图,这很快就会变成意大利面并使你的代码更加脆弱.相反,以下模式允许您的不同视图保持分离,同时仍然可以完成工作.

全球通知/事件

这是你提到的那个.它的工作原理,但你所提到的并不优雅,因为它不必要地在全球范围内广播

绑定/观察者模式

创建一个editViewPosition在控制器中命名的对象,并公开方法,让显示视图更改editViewPosition的值.然后,EditView可以监听并观察其中的变化editViewPosition并相应地更新自身.这种方法的优点在于,以后你可以让5个不同的EditViews所有人editViewPosition在你的控制器上观察相同的属性并相应地更新自己,并且你不需要为此而改变DisplayView.

委托模式

您可以允许显示视图具有delegate属性,而不是直接连接视图和调用方法,可以将控制器设置为edit视图.当DisplayView想要更新其编辑视图时,它将检查其委托是否存在并实现预定义的函数,如果是,它将调用该函数.这种方法比观察者模式更加耦合,但仍允许高度去耦(后来例如你可以在那里交换完全不同的视图而不是你的编辑视图,程序应该仍然可以工作.)这种方法的弱点是您通常只有一个委托,但它比任何其他提到的模式更直接.

手动维护要通知的对象列表

这几乎是委托模式的扩展.基本上,EditView在显示视图中有一组相似的对象,并且在需要时,您的显示视图将遍历每个对象上的数组和调用方法.该阵列将再次由您的控制器填充.

结论

就个人而言,我最有可能将绑定和观察者模式用于您的用例.通常,并行的视图(没有直接的父/子关系)不应该保持彼此的引用,并且应该仅通过它们共享的公共控制器/事件/通知/其他超级结构进行通信.

  • 托尼,你能提供一些Binding/Observer模式的示例代码吗? (2认同)