将ItemView从一个CollectionView移动到另一个CollectionView而不删除它,最佳做法?

时间:2013-06-10 22:10:11

标签: marionette

我正在构建仪表板构建器并查看Marionette的界面。我从遗留代码中获得了一些非常重量级(大型报告)的视图,因此html是在服务器上预先构建的。

我在仪表板中的每一行都有一个Marionette CollectionView,其中包含在仪表板构建期间拖到行上的每个小部件的ItemView。

当用户将小部件从一行移动到另一行时,我想避免删除视图并重新构建它(因为这将是很多不必要的dom操作),而是想要从一个(行)中分离元素)CollectionView并将其添加到另一个。使用Marionette中的CollectionViews实现此目的的最佳实践是什么?

默认情况下,在CollectionViews中移动项目会破坏视图/模型,并在另一个中重新实例化/重新渲染。

我担心的是DOM中的tablereport会从一个集合移动到另一个集合,而不是原始的Marionette / Backbone模板生成的View,它只是我们设置为视图的预定义DOM元素。

tablereport DOM元素有很多子元素,通过遗留代码而不是Backbone视图事件数组或Backbone的listenTo调用与事件相关联。因此,破坏DOM tablereport元素是我们需要避免保留这些事件的,我们只想在DOM中重新定位它。

什么是在Marionette中有效处理此功能的最佳方式。

1 个答案:

答案 0 :(得分:0)

我想到了几个选项,但是事件绑定代码不容易调用的事实意味着您可能希望使用jQuery detach()方法在删除元素时保留所有事件。< / p>

一种选择是在构建视图元素时缓存它们: - 在CompositeView的buildItemView方法中编写一个您委派的视图工厂。 - 让您的工厂缓存它为模型的model.cid创建的视图的元素,该模型作为buildItemView方法的第一个参数传入。 - 调用工厂方法时,从缓存中检索元素(如果存在),在其上调用detach(),并将其设置为ItemView的元素。 - 覆盖视图上的render方法以阻止它重建html - 从一个CollectionView的集合中移动模型并将其放入另一个CollectionView的集合中,然后Marionette将如上所述构建您的视图,并将元素(事件仍然绑定)插入到DOM中。

您可以假设您知道哪个ItemView已被删除,而不是执行上述操作: - 从第一个CollectionView的子容器中删除ItemView(我相信这是一个Backbone.Babysitter实例,并且有文档) - 分离ItemView的元素 - 将ItemView的元素插入DOM中的新位置 - 将ItemView插入第二个CollectionView的子容器中 - 从第一个CollectionView的集合中删除模型 - 以静默方式将模型添加到第二个CollectionView的集合中,这可以防止CollectionView触发构建新视图,渲染和插入新视图的正常行为。

第一种方式可能更优雅,因为你仍然让Marionette做它的事情,但只是改变了ItemViews的构建,渲染和插入。第二种方式不那么复杂,但意味着你必须自己手动保持所有内容同步 - 基本上做的是Marionette通常在幕后做的事情,并阻止它“干扰”,可以这么说。