12

我有一个CollectionModels. 每个模型都有一个DisplayView始终可见。还有一个只有在单击EditView关联时才可见。DisplayView

DisplayViewEditView出现在不同的父视图中。现在我正在使用“事件聚合器”模式来告诉我的应用程序在单击EditViewa 时呈现DisplayView。此处描述的模式: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而不是将它们解耦。

正如我所说,问题在于它们是在不同的父视图中呈现的。DisplayViewsget 中渲染,HeaderView而getEditViews中渲染ContentView

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

4

3 回答 3

15

尽可能避免视图引用并行视图(与父/子视图相反)并相互修改,这会很快变成意大利面条并使您的代码更加脆弱。相反,以下模式允许您的不同视图在完成工作的同时保持解耦。

全局通知/事件

这是你提到的那个。它可以工作,但就像你提到的那样不够优雅,因为它不必要地在全局范围内广播自己

绑定/观察者模式

创建一个在控制器中命名的对象editViewPosition并公开方法以让显示视图更改 editViewPosition 的值。然后EditView可以监听并观察 中的变化editViewPosition并相应地更新自身。这种方法的优势在于,稍后您可以让 5 个不同EditViews的所有人都在控制器上观察相同的属性editViewPosition并相应地更新自己,并且您无需更改任何内容即可DisplayView实现这一点。

委托模式

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

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

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

结论

就个人而言,我很可能会为您的用例使用绑定和观察者模式。一般来说,并行的视图(没有直接的父/子关系)不应该保持相互引用,并且应该只通过它们共享的公共控制器/事件/通知/其他上层结构进行通信。

于 2012-01-15T16:09:31.693 回答
1

除了 Tony 列举的那些选项之外,还有另一个选项,它正在“冒泡”一个事件,当单击 到 and 的最接近的公共父视图时触发该DisplayView事件。使用事件传递显示视图的坐标和它所代表的模型。然后公共父级直接调用一个方法来重新定位它并渲染正确的模型。因此并行视图之间没有显式引用,也没有全局变量。DisplayViewEditViewEditView

使用主干的内置方法triggerlistenTo方法在多个视图层上冒泡事件会变得混乱,但是 Backbone.Courier 插件使它非常简单:

https://github.com/rotundasoftware/backbone.courier

于 2013-02-04T07:17:48.603 回答
0

如果您已经将应用程序解耦,请保持这种方式。在视图之间引入直接依赖关系将使您的应用程序更难维护,并且总体上更令人沮丧。

事件是去这里的方式。

于 2012-01-13T14:45:45.213 回答