0

私はこれをすべて間違って使用しているかもしれませんが、

製品のコレクションを表す ArrayController があります。各製品がレンダリングされ、ユーザーが実行できるアクションがいくつかあります。たとえば、製品のタイトルを編集したり、別の製品から説明をコピーしたりします。

質問: 使用している特定の製品のコントローラーをどのように操作しますか? コントローラはどの製品が編集されているかをどのように知るのでしょうか?

また、selectionBinding を「controller.somevar」に設定して Ember.Select を作成しようとしましたが、これも失敗しました。

4

2 に答える 2

1

あなたがしなければならない最も重要なことは、最初にできるだけ多くのロジックをビューから離れてコントローラーに移動することだと思います。

あなたの場合に役立つもう1つのことはitemController、リストに各製品を含めることです。そうすれば、このアイテム コントローラーでアイテム固有のロジックを処理できます。

あなたのアーキテクチャを理解するのに十分な情報がないので、いくつかの仮定を立てます。

あなたが以下を持っているとしますProductsController

App.ProductsController = Ember.ArrayController.extend();

ProductControllerすべての製品を独自にラップするために作成されるを作成する必要があります。

App.ProductController = Ember.ObjectController.extend();

テンプレートを次のように変更する必要があります。

{{#each controller itemController="product"}}
  <li>name</li>
{{/each}}

これで、リスト内のすべての製品が独自の を持ちProductController、1 つの製品のイベントを処理でき、すべてのリスト アイテムのコンテキストとして機能します。

別のオプション:

一度に 1 つの製品のみを処理する場合は、ルートを使用して、作業している製品を説明できます。

App.Router.map(function() {
  this.resource('products', { path: '/products' }, function() {
    this.resource('product', { path: '/:product_id' }, function() {
      this.route('edit');
    });
  });
});

そして、製品を編集するためのコントローラーを作成します。

App.ProductEditController = Ember.ObjectController.extend();

そして、リスト項目はその製品ルートにリンクします:

{{#each controller}}
  <li>{{#linkTo "product.edit" this}}name{{/linkTo}}</li>
{{/each}}
于 2013-03-23T10:55:37.153 に答える
0

で定義する場合itemControllerProductsControllerテンプレートでその詳細を指定する必要はありません。

App.ProductsController = Em.ArrayController.extend({
  itemController: 'product',
  needs: ['suppliers'],
  actions: {
    add: function() {
      // do something to add an item to content collection
    }
  } 
});

App.ProductController = Em.ObjectController.extend({
  actions: {
    remove: function() {
       // do something to remove the item
    }
  }
});

次のようなコレクション テンプレートを使用します。

<button {{action="add"}}>Add Item</button>
<ul>
{{#each controller}}
  <li>{{name}} <button {{action="remove"}}>x</button></li>
{{/each}}
</ul>

Ember のドキュメントでは、次のように説明されitemController ています

項目コントローラーを動的に決定できる関数を定義することもlookupItemControllerできます (たとえば、おそらくモデル タイプに基づいて)。

ArrayController別のテンプレート/ビュー内でラップされたコレクションをレンダリングするときに見つけたのは、#each使用方法です。Teddy Zeeny が示すように必ず使用{{#each controller}}してください。そうしないと、アイテム コントローラーでラップされたアイテムではなく、コンテンツ モデル アイテムを使用することになります。これは、アイテム コントローラーまたはその他のコントローラー ベースのコンテンツ装飾によって処理されることを意図したアクションを使用してみるまで気付かない場合があります。

コレクション全体を別のビューにネストする必要がある場合、次のようにビュー ヘルパーを使用してコンテキストを正しく設定し、コレクション レベルのアクション (項目の追加ボタン アクションなど) がメイン コントローラーの設定ではなくアレイ コントローラーによって処理されるようにします。ルートによって。

したがって、私の製品テンプレートでは、ネストされたサプライヤーをリストするために次のようなことを行います (「製品」のルートに「サプライヤー」コントローラーが適切にあると仮定します)。

{{view controller=controllers.suppliers templateName="products/suppliers"}}

サプライヤー テンプレートは、上に示したテンプレートと同じパターンに従っています。

于 2014-05-06T03:44:06.693 に答える