1

サブビューの作成に関して、リージョンとコンテナの違いを理解するのに苦労しています。親内にサブビューを作成するときのユースケースは何ですか?

次に、サブビューとして登録すると、これら 2 つのオプションとどのように連動するのでしょうか? コンテナーを使用する場合に関係なく、またはコンテナーを使用する場合にのみ、それを行う必要がありますか?

4

1 に答える 1

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

ただし、両方を持っているregioncontainer宣言した場合、ビューのelプロパティは最初に領域要素に設定され、次にコンテナ要素に設定されます。最終結果は、ビューのelプロパティがコンテナ要素に設定されることです。

ソースコード: view.coffee 行 147

ただし、ビューをアタッチする場合、ビューはまず宣言された領域に自分自身をアタッチしようとします。次に、コンテナーがまだ DOM にない場合は、コンテナーにアタッチしようとします。

これが意味することは、 と の両方regioncontainer宣言した場合、ビューは実際には region 要素に追加され、container 要素には決して追加されないということです。

ソース コード: view.coffee 行 443

これら 2 つの動作を考えると、View で領域とコンテナーの両方を宣言することはお勧めできません (少なくともnoWraptrue に設定した場合)。


あるユースケースに関する質問に答えるには、次のようにします。

リージョンとコンテナーの両方の実装の違いは非常に微妙です。ビューの親要素を文字列に抽象化する場合、または親要素をビュー インスタンスに渡す必要がない場合は、リージョンの方が適している場合があります。一方、子ビューをその親ビューにさらに緊密に結合したい場合は、コンテナーを宣言する方が良い選択かもしれません。

View インスタンスをサブビューとして登録することは、どのオプションを選択しても同じように機能するはずです。

コンテナー オプションを介して追加する場合でも、View インスタンスをサブビューとして登録する必要はないことに注意してください。サブビューは、自動的に破棄されるビューの単純な文字列抽象化です。

于 2014-02-20T17:04:29.273 に答える