在创建子视图时,我很难理解区域和容器之间的区别。在父视图中创建子视图时,一个视图相对于另一个视图的用例是什么?
其次,将事物注册为子视图如何与这两个选项结合使用?无论是使用容器还是仅在使用容器时都需要这样做?
卓别林的区域和容器非常相似。区域和容器之间的主要区别在于将视图附加到它们中的方式。
区域是通过Chaplin中介附加的抽象字符串映射,而容器是视图必须知道的选择器(在视图声明中传入或设置)。
在Chaplin源代码中找到(view.coffee第77行):
区域本质上是命名的选择器,旨在解耦视图来自其父级。
另一方面,容器只是传递给视图或直接在视图上设置的选择器字符串。
这是一个微妙的使用差异:
# region is a string mapping
# MyView does not need to know about the associated DOM element
class MyView extends Chaplin.View
region: 'myRegion'
# container is a selector string
# MyView needs to know about the associated DOM element
class MyView extends Chaplin.View
container: 'div#myContainer'
如果在视图尝试附加到某个区域时,该区域尚未注册,则会引发错误。
区域和容器的实现方式有点棘手:
如果将视图的noWrap
属性设置为true,则区域元素或容器元素将成为视图的el
。
但是,如果同时声明了region
和container
,则View的el
属性首先设置为region元素,然后设置为container元素。最终结果是View的el
属性将被设置为容器元素。
源代码:view.coffee line 147
但是,在附着视图时,视图首先尝试将自己附着到其声明的区域。然后,如果容器不在DOM中,它将尝试附加到容器。
这意味着,如果同时声明了region
和container
,则视图实际上将被附加到区域元素中,而不会附加到容器元素中。
源代码:view.coffee第443行
考虑到这两种行为,在视图上同时声明区域和容器不是一个好主意(至少如果将noWrap
设置为true)。
回答您关于一个用例而不是另一个用例的问题:
区域和容器在实现方面的差异非常微妙。如果您想将视图的父元素抽象为字符串,或者不想将父元素传递到视图实例中,那么区域可能是更好的选择。另一方面,如果您想将子视图与其父视图更紧密地耦合,那么声明容器可能是更好的选择。
将视图实例注册为子视图应该是一样的,无论您选择使用哪个选项。
需要注意的是,即使通过容器选项将View实例附加到中,也不需要将其注册为子视图。子视图只是自动处理的视图的字符串抽象。