2

ビューのコレクションでプロパティをバインドする最良の方法を理解しようとしています。

ドキュメントによると、MVC アーキテクチャでは、モデル インスタンスに直接ではなく、「実際には、ビューのプロパティをコントローラー レイヤーにバインドする必要があります」。これは、1 つのオブジェクトだけを制御するコントローラーがある場合にはうまく機能しますが、コレクションを扱う場合にはうまく機能しないようです。

標準的なToDoの例では、ビューは

{{#collection contentBinding="Todos.todosController" tagName="ul"
 itemClassBinding="content.isDone"}}
  {{view Em.Checkbox titleBinding="content.title"
    valueBinding="content.isDone"}}
{{/collection}}

これは基本的に、各モデルのプロパティに直接バインドされています。配列コントローラーが何らかの形でこれらのプロパティをプロキシしていることは理解していますが、モデル オブジェクトに直接存在するプロパティしか参照できません。

ToDo のアプリで、ビューにさらにいくつかの状態を表示したいとしましょう。たとえば、ビューを展開したり折りたたんだりできるようにしたいとします。エキスパンダー フレームとコンテンツを含む ToDo ビュー全体を表すビュー オブジェクトがある場合、そのビューのプロパティ 'isExpanded' を何かにバインドする必要があります。

オブジェクトが 1 つだけで、配列以外のコントローラーがある場合は、コントローラーに「isExpanded」プロパティを配置することがあります。次に、小さな三角形のアイコンを反転すると、コントローラーでこのプロパティを設定でき、ビューはこれに気づき、展開します。

しかし、アレイ コントローラでは、このプロパティを保持して個々の ToDo を参照させる明白な方法はありません。上記の標準的な例から、モデルのプロパティにバインドする必要があるようです。しかし、「isExpanded」のような一時的なビュー中心のプロパティを ToDo モデル自体に入れなければならないのはばかげているようです。

助言がありますか?

4

1 に答える 1

0

コントローラーにプロパティを配置しないでください。少なくとも ember の派生元である Sproutcore では、これによりモデルのステータスが変更されますが、これは望ましくありません。プロパティがモデルにないためです。さらに、ビューの展開状態はビューの問題です。モデルは、その表示方法を気にしません。MVCのまま。

プロパティexpandedをビュー自体に配置し、displayProperties配列内の値にします。 ember コードを調べる (599 行目)

その配列の値が変更されるたびに、ビューを再レンダリングする必要があります。とにかく、それは私が Sproutcore で行うことです。

コメントを更新します。2 つのアプローチ:

1)次のように定義します

displayProperties: ['expand']
...
expandBinding: Em.Binding.oneWay('xyz')

あなたの意見に。そうすれば、1 つのトリガーが変更されると、すべてのアイテム ビューが展開されます。

2)ビューへの参照を保持し、ステートチャートで、ユーザーが展開ボタンをクリックすると、ビューをループして展開プロパティを設定します。

オプション 1 はより単純ですが、多数のバインドを作成するとパフォーマンスに影響を与える可能性があります。オプション 2 は多くのバインディングを使用しません。オプション 1 から始めて、パフォーマンスに問題がある場合はオプション 2 に進むことをお勧めします。

于 2012-07-03T13:58:46.253 に答える