在创建子视图时,我很难理解区域和容器之间的区别。在父级中创建子视图时,一个在另一个上的用例是什么?
其次,将事物注册为子视图如何与这两个选项结合使用?无论或仅在使用容器时都需要这样做吗?
在创建子视图时,我很难理解区域和容器之间的区别。在父级中创建子视图时,一个在另一个上的用例是什么?
其次,将事物注册为子视图如何与这两个选项结合使用?无论或仅在使用容器时都需要这样做吗?
卓别林中的区域和容器非常相似。区域和容器之间的主要区别在于将视图附加到其中的方式。
区域是一个抽象的字符串映射,它通过卓别林调解器附加,而容器是视图必须知道的选择器(传入或在视图声明中设置)。
在卓别林源代码(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
View 的属性设置为 true,则区域元素或容器元素将成为 View 的el
。
但是,如果您同时拥有region
并container
声明了 View 的el
属性,则首先将其设置为区域元素,然后设置为容器元素。最终结果是将 View 的el
属性设置为容器元素。
然而,在附加视图时,视图首先尝试将自身附加到其声明的区域。然后,如果它不在 DOM 中,它将尝试附加到容器。
这意味着如果您同时拥有region
和container
声明,则视图实际上将附加到区域元素中,而永远不会附加到容器元素中。
源代码:view.coffee 443行
鉴于这两种行为,在视图上同时声明区域和容器并不是一个好主意(至少如果您设置noWrap
为 true)。
要回答您关于一个用例而不是另一个用例的问题:
区域和容器的实现差异非常微妙。如果您想将视图的父元素抽象为字符串,或者您不想将父元素传递给视图实例,那么区域可能是更好的选择。另一方面,如果您想将您的子视图更紧密地耦合到它的父视图,那么声明一个容器可能是一个更好的选择。
无论您选择使用哪个选项,将 View 实例注册为子视图都应该可以正常工作。
应该注意的是,即使通过容器选项将 View 实例附加到子视图中,也不需要将其注册为子视图。子视图只是自动处理的视图的字符串抽象。