卓别林区域与容器和子视图

时间:2014-02-18 20:01:18

标签: backbone-views chaplinjs

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

其次,如何将子视图作为子视图与这两个选项一起注册?这是否需要发生,无论是否仅在使用容器时?

1 个答案:

答案 0 :(得分:2)

卓别林的地区和集装箱非常相似。区域和容器之间的主要区别在于视图附加到它们中。

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

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

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


如何实现区域和容器变得有点棘手:

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

但是,如果您同时声明regioncontainer el属性,则首先将视图的el属性设置为region元素,然后设置为容器元素。最终结果是View region属性将被设置为容器元素。

源代码:view.coffee line 147

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

这意味着如果您同时声明containernoWrap,视图将实际附加到region元素中,并且永远不会附加到容器元素中。

源代码:view.coffee line 443

鉴于这两种行为,在视图上声明区域和容器都不是一个好主意(至少如果将{{1}}设置为true)。


回答有关一个用例而不是另一个用例的问题:

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

无论您选择使用哪个选项,将View实例注册为子视图都应该相同。

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