2014-02-18 31 views
1

在創建子視圖時,我很難理解區域和容器之間的區別。在父項中創建子視圖時,相互之間的用例是什麼?卓別林地區vs容器和子視圖

其次,作爲子視圖註冊的東西如何與這兩個選項一起工作?這是否需要在使用容器時發生?

回答

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' 

如果區域尚未在視圖試圖連接到它的時候登記的,錯誤將被拋出。


區和集裝箱如何得到實現變得有點棘手:

如果你有一個視圖設置爲true的noWrap財產,區域元素或容器元素成爲視圖的el

但是,如果你有兩個regioncontainer宣佈查看的el屬性首先被設置爲區域元素,則容器元素。最終結果是視圖的el屬性將被設置爲容器元素。

源代碼:view.coffee line 147

當涉及到附加視圖,然而,視圖首先嚐試本身附加到其聲明區域。然後它會嘗試附加到容器,如果它不在DOM中。

這意味着如果你同時聲明瞭regioncontainer,視圖實際上會被追加到region元素中,並且永遠不會追加到容器元素中。

的源代碼:view.coffee line 443

鑑於這兩種行爲不會是一個視圖同時聲明一個地區,一個容器是一個好主意(至少如果你設置noWrap爲true)。


要回答你關於一個使用案例超過另一個問題:

在實現這兩個地區和容器的區別是非常微妙的。如果您想將視圖的父元素抽象爲字符串,或者不想將父元素傳遞給視圖實例,那麼區域可能是更好的選擇。另一方面,如果你想更緊密地將你的子視圖耦合到它的父視圖,那麼聲明一個容器可能是更好的選擇。

將視圖實例註冊爲子視圖應該可以工作,無論您選擇哪個選項。

應該注意的是,即使通過容器選項將視圖實例附加到子視圖,也不需要註冊View實例。子視圖只是自動處理的視圖的字符串抽象。

相關問題