在?来唠唠Marionette.CollectionView你可能会用到的东西

165 阅读4分钟

一、前言

CollectionView的视图可以通过一个单一的父DOM元素或el来管理一组有序的子视图,这些子视图显示在主视图的el中。这些子视图通常是为了匹配Backbone.Collection的模型而创建的。那我们要怎么在视图里编写CollectionView呢?且听我慢慢唠唠

二、关于CollectionView

1. 实例化一个CollectionView

当实例化一个CollectionView时,有如下几个属性,可以直接附加到实例上: attributes,behaviors, childView, childViewContainer, childViewEventPrefix,childViewEvents, childViewOptions, childViewTriggers, classNamecollection, collectionEvents, el, emptyView, emptyViewOptions, events, id, model, modelEvents, sortWithCollection, tagName, template, templateContext, triggers, ui, viewComparator, viewFilter

其中一些属性来自于Marionette,但很多是继承自Backbone.View

const myCollectionView = new CollectionView({ ... });

2. 渲染一个CollectionView

CollectionView的render方法主要负责渲染整个集合。它循环浏览集合中的每个子集,并将它们作为一个子集单独渲染。

const MyCollectionView = CollectionView.extend({...}); 
// 所有的子视图都将会被渲染呈现出来 
new MyCollectionView().render();
  • 渲染模板

除了渲染子视图外,CollectionView还可以有一个模板。子视图可以在这个模板的DOM元素中被渲染。CollectionView会将模型或集合连同上下文一起序列化,以便模板渲染。

  • 重新渲染CollectionView

如果你需要重新渲染整个集合或模板,你可以调用collectionView.render方法。这个方法将销毁所有之前可能已经添加的子视图。

3. 视图生命周期和事件

一个实例化的CollectionView会意识到它的生命周期状态,并且会抛出与该状态变化有关的事件。视图状态表明视图是否被渲染、连接到DOM上,或者被销毁。

4. 实体事件

CollectionView可以绑定发生在附加模型和集合上的事件。

5. DOM交互效果

除了Backbone提供的视图之外,Marionette还有额外的API用于DOM交互:events, triggers和ui。

默认情况下,ui只与模板内的元素绑定。然而,由于事件和触发器被委托给视图的el,它们将适用于任何子元素。在某些情况下,当你想用getUI()访问CollectionViews内的元素时,绑定ui是有帮助的。对于这些情况,你需要自己绑定ui。要做到这一点,在CollectionView上运行bindUIElements。

const MyCollectionView = CollectionView.extend({ 
    // ... ui: { checkbox: 'input[type="checkbox"]' 
} });
const collectionView = new MyCollectionView(); 
collectionView.bindUIElements();
console.log(collectionView.getUI('checkbox')); 

7. 管理子节点

一旦CollectionView被渲染,子节点就会被自动管理。对于集合中的每个模型,CollectionView会在其子对象中建立并存储一个子视图。这允许你轻松地访问集合视图中的视图,迭代它们,通过一个给定的索引器(如视图的模型或ID)找到它们等等。

在最初的渲染之后,CollectionView会绑定到集合的更新和重置事件。

当视图的集合被重置时,视图将销毁所有的孩子并重新渲染整个集合。

当一个模型被添加到集合中时,CollectionView会将该模型渲染到子集中。

当一个模型从集合中移除(或销毁/删除),CollectionView将销毁并移除该模型的子视图。

当视图的集合被排序时,除非CollectionView的sortWithCollection属性被设置为false,或者viewComparator为false,否则视图默认会自动重新排序其子视图。

8.传递数据到子视图

在某些情况下,你可能需要将数据从父集合视图传递到每个子视图实例中。要做到这一点,在你的集合视图上定义一个childViewOptions,作为一个对象字面。这将作为选项的一部分传递给childView的构造函数。

你也可以将childViewOption指定为一个函数,如果你需要在运行时计算返回的值。如果你在计算childViewOptions时需要访问该模型,该模型将被传递到该函数中。该函数必须返回一个对象,并且该对象的属性将被复制到childView实例的选项中。

三、编写CollectionView

1.在主视图中实例化并渲染一个CollectionView

image.png

2.子页面视图中编写相关业务操作

image.png

四、更多相关

最后,如果想了解更多关于Marionette.CollectionView的相关操作,可点击跳转原文档Marionette.CollectionView