サブビューの作成に関して、リージョンとコンテナの違いを理解するのに苦労しています。親内にサブビューを作成するときのユースケースは何ですか?
次に、サブビューとして登録すると、これら 2 つのオプションとどのように連動するのでしょうか? コンテナーを使用する場合に関係なく、またはコンテナーを使用する場合にのみ、それを行う必要がありますか?
サブビューの作成に関して、リージョンとコンテナの違いを理解するのに苦労しています。親内にサブビューを作成するときのユースケースは何ですか?
次に、サブビューとして登録すると、これら 2 つのオプションとどのように連動するのでしょうか? コンテナーを使用する場合に関係なく、またはコンテナーを使用する場合にのみ、それを行う必要がありますか?
Chaplin のリージョンとコンテナーは非常に似ています。リージョンとコンテナの主な違いは、ビューがリージョンに追加される方法にあります。
領域は、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'
ビューがリージョンにアタッチしようとした時点でリージョンが登録されていない場合、エラーがスローされます。
リージョンとコンテナがどのように実装されるかは少しトリッキーになります:
ビューのnoWrap
プロパティを true に設定すると、リージョン要素またはコンテナ要素がビューの になりますel
。
ただし、両方を持っているregion
とcontainer
宣言した場合、ビューのel
プロパティは最初に領域要素に設定され、次にコンテナ要素に設定されます。最終結果は、ビューのel
プロパティがコンテナ要素に設定されることです。
ソースコード: view.coffee 行 147
ただし、ビューをアタッチする場合、ビューはまず宣言された領域に自分自身をアタッチしようとします。次に、コンテナーがまだ DOM にない場合は、コンテナーにアタッチしようとします。
これが意味することは、 と の両方region
をcontainer
宣言した場合、ビューは実際には region 要素に追加され、container 要素には決して追加されないということです。
ソース コード: view.coffee 行 443
これら 2 つの動作を考えると、View で領域とコンテナーの両方を宣言することはお勧めできません (少なくともnoWrap
true に設定した場合)。
あるユースケースに関する質問に答えるには、次のようにします。
リージョンとコンテナーの両方の実装の違いは非常に微妙です。ビューの親要素を文字列に抽象化する場合、または親要素をビュー インスタンスに渡す必要がない場合は、リージョンの方が適している場合があります。一方、子ビューをその親ビューにさらに緊密に結合したい場合は、コンテナーを宣言する方が良い選択かもしれません。
View インスタンスをサブビューとして登録することは、どのオプションを選択しても同じように機能するはずです。
コンテナー オプションを介して追加する場合でも、View インスタンスをサブビューとして登録する必要はないことに注意してください。サブビューは、自動的に破棄されるビューの単純な文字列抽象化です。