6

ActionEmberモデルに対応するオブジェクトのリストがあるとします。それぞれにいくつかのプロパティ(タイムスタンプ)とdetail属性があり、再帰的にさらに多くのsを含めることができますdetail(任意に深いネスト)。詳細はネストされたリストと考えることができます。

detail任意のオブジェクトのを簡単に編集(値のオートコンプリート、簡単なコピーと貼り付け、要素の並べ替えなど)できるUIを作成したいと思いActionます。

今のところ、私のDetailViewテンプレートは再帰的に追加のsをレンダリングしますDetailView

{{#if view.content.hasChildren}}
    {{#each child in view.content.children}}
       {{#DetailView contentBinding=child}}
    {{/each}}
{{#else}}
    {{#EditDetailView contentBinding=view.content.value}}
{{/if}}

したがって、それぞれDetailsViewが詳細オブジェクトツリーのノードに対応します。

しかし、コントローラーをミックスに追加する方法がわかりません。保存する必要のある追加の状態/実装する機能があります(たとえば、DetailsViewに表示するためにDetailオブジェクトから値を変換する、要素を挿入/削除/並べ替えるためのイベントを処理する、モデルにもビューにも属さない詳細ツリーの構造の変更)。

理想的には、 1人あたりDetailsControllerのプロキシとして機能します。コントローラを動的にインスタンス化し、ビューテンプレート内でそのコンテンツを設定できますか?新しいEmberルーターについての私の理解は、特定のルートにコントローラーとアウトレットをセットアップすることです。ただし、ルーティングがまったく行われていないため、ここでは当てはまらないようです。再帰的なコントローラー/ビュー/ルートの処理方法に関するすべての提案/洞察を歓迎します。DetailsDetailsView

EmberJSのネストされたビューとコントローラーを確認しましたが、これはArrayController、すべてDetailのsに対して単一であると提案していActionます。これは、ネストされた詳細のツリー構造も保持しません。

Ember 0.9.6にアップグレードした後、ハンドルバーテンプレートの再帰ビューが機能しないことも確認しましたが、ソリューションはコントローラーについて何も述べていません。

4

1 に答える 1

7

**更新2013年2月20日**

ヘルパーのAPIドキュメントがここから{{control}}入手できるようになりました。「コントロールヘルパーは現在開発中であり、実験的であると考えられています」と警告しています。

有効にするには、ENV.EXPERIMENTAL_CONTROL_HELPER = trueEmberを要求する前に設定します。

**更新2013年2月3日**

新しいヘルパー{{control}}が残り火に追加され、再利用可能なビューの提案が実装されました。したがって、DetailsControllerプロキシをDetails1つにするために、次のDetailsViewことができます。

{{control 'detail' child}}

たとえば、{{control}}テストを参照してください


理想的には、DetailsViewごとの詳細のプロキシとして機能するDetailsControllerが必要です。コントローラを動的にインスタンス化し、ビューテンプレート内でそのコンテンツを設定できますか?

通常、これを行う方法は{{render}}、適切なビューとコントローラーを使用してテンプレートをレンダリングするハンドルバーヘルパーを使用することです。残念ながら{{render}}、同じテンプレートを複数回挿入するために使用することはできないため、{{each}}ブロック内で使用することはできません。

最近、このトピックについて長い議論がありました。参照:非シングルトンコントローラーの説明

2つの解決策が提案されました。itemControllerClass1つ目は、 ArrayControllerにプロパティを追加することです。このプロパティが設定されている場合、ArrayControllerは指定されたクラスの新しいコンテンツを自動的にラップします。これは数週間前に残り火に追加され、ほとんどのユースケースを処理します。この場合、アイテムのフラットリストがあり、それぞれをプロキシでラップする必要があります。

2番目の提案であるReusableViewsを使用すると、ビューにコントローラークラスを提供できます。

{{view UI.Calendar dateBinding="post.startDate" controllerClass="App.CalendarController"}}

これにより、UI.CalendarウィジェットごとにApp.CalendarControllerのインスタンスが作成され、ウィジェットのライフサイクルに関連付けられます。現在、これは実装されていません。{{view}}には、コントローラーを作成するオプションが必要です。最新のステータスについて。

したがって、AFAIKには、概説したユースケースでこれを実現するための良い方法はありません。その間、データをビューにバインドします。

{{view App.DetailView contentBinding="child"}}

そして、ビュー自体にいくつかのロジックを含めることは合理的と思われます。再利用可能なビューのサポートがマスターに追加された場合、そのロジックをコントローラーにプルアップできます。

参照:https ://github.com/emberjs/ember.js/issues/1766

于 2013-01-23T16:32:28.363 に答える