1

在创建子视图时,我很难理解区域和容器之间的区别。在父级中创建子视图时,一个在另一个上的用例是什么?

其次,将事物注册为子视图如何与这两个选项结合使用?无论或仅在使用容器时都需要这样做吗?

4

1 回答 1

2

卓别林中的区域和容器非常相似。区域和容器之间的主要区别在于将视图附加到其中的方式。

区域是一个抽象的字符串映射,它通过卓别林调解器附加,而容器是视图必须知道的选择器(传入或在视图声明中设置)。

在卓别林源代码(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'

如果在视图尝试附加到某个区域时尚未注册该区域,则会引发错误。


区域和容器的实现方式变得有点棘手:

如果您将noWrapView 的属性设置为 true,则区域元素或容器元素将成为 View 的el

但是,如果您同时拥有regioncontainer声明了 View 的el属性,则首先将其设置为区域元素,然后设置为容器元素。最终结果是将 View 的el属性设置为容器元素。

源代码:view.coffee 第147行

然而,在附加视图时,视图首先尝试将自身附加到其声明的区域。然后,如果它不在 DOM 中,它将尝试附加到容器。

这意味着如果您同时拥有regioncontainer声明,则视图实际上将附加到区域元素中,而永远不会附加到容器元素中。

源代码:view.coffee 443行

鉴于这两种行为,在视图上同时声明区域和容器并不是一个好主意(至少如果您设置noWrap为 true)。


要回答您关于一个用例而不是另一个用例的问题:

区域和容器的实现差异非常微妙。如果您想将视图的父元素抽象为字符串,或者您不想将父元素传递给视图实例,那么区域可能是更好的选择。另一方面,如果您想将您的子视图更紧密地耦合到它的父视图,那么声明一个容器可能是一个更好的选择。

无论您选择使用哪个选项,将 View 实例注册为子视图都应该可以正常工作。

应该注意的是,即使通过容器选项将 View 实例附加到子视图中,也不需要将其注册为子视图。子视图只是自动处理的视图的字符串抽象。

于 2014-02-20T17:04:29.273 回答