0

ハンドルバー テンプレート内にコントローラーの新しいインスタンスが必要です。

これが私の状況の簡単な例です。(コーヒークリプトの使用を許してください)

Emberには、モデルがあります:

App.Foo = DS.Model.extend

  attr: DS.attr()
  ...

エンドポイントなどからロードします。そして、配列コントローラーに配置します。

App.FooArray = Ember.ArrayController.extend

  ###*
   * Array of App.Foo
   * @type {Array}
   */
  content:

  method: ->
    ...

最後に、このモデル用の「インスタンス」コントローラーを用意しました。これは、さらなるメソッドを実装します (つまり、これはルーター レベルで見られるようなシングルトン コントローラーではなく、メソッドとイベントを追加してモデルを拡張するデコレーター (またはプロキシー) です)。ハンドラー):

App.FooController = Ember.ObjectController.extend

  ###*
   * Content
   * @type {App.Foo}
   */
  content: null

  action: ->
    ...

ハンドルバーでは、次のアイテムを反復処理したいApp.FooArray:

{{#each myFooArray}}
  Hi! My attr is {{attr}}
{{/each}}

など..これは、パラメーターなどに対して見事に機能します。

ただし、アクション (または FooController に属する他のプロパティ) を使用するときに問題が発生します。

{{#each myFooArray}}
   Hi! My attr is {{attr}} <a {{action 'action'}}>Action me!</a>
{{/each}}

突然、私の行動がうまくいきません。これは、アクション ヘルパーがアクションを 'this' に適用するのではなく、より上位のコントローラーに適用するためです。

これを回避するには、ターゲット (コントローラーなど) を渡す必要があります。

{{action 'action' target=**********}}

さて、私が欲しいコントローラーは のインスタンスですApp.FooController。今まで、私はモデル内でコントローラをインスタンス化してきました (ヤバイ!):

App.Foo = DS.Model.extend

  attr: DS.attr()
  ...
  attrn: DS.attr()

  myController: Ember.computed (->
    App.FooController.create
      content: this
  )

したがって、次のように繰り返します。

{{#each myFooArray}}
  Hi! My attr is {{attr}} <a {{action 'action' target=myController}}>Action me!</a>
{{/each}}

これが悪いことだとはわかっていますが、これ以上の方法は思いつきません。誰か、私が光を見るのを手伝ってください!

4

2 に答える 2

0

この質問は、ArrayControllers、CollectionViews、Models、および ObjectControllers に関する重要で長年の疑問を提起します。

これを書いている時点では、Ember の内部動作に関する私の知識は限られていました。ただし、次のように質問をより簡潔に言い換えることができます。

モデルの ArrayController、CollectionView、およびインスタンスコントローラーが与えられた場合、どのようitemControllerClassに ArrayController のプロパティを利用してそのコンテンツを反復処理し、各項目を の一意の (つまりシングルトンではない) インスタンスにラップできますitemControllerか?

この問題は長期にわたるものであり、解決策は@jeremy-greenに反響しますが、ここで詳しく説明します.

ただし、最初に: 問題をカプセル化する Ember サポート スレッド: https://github.com/emberjs/ember.js/issues/1637

そこでの議論は、特定の状況での非シングルトン コントローラーの必要性を非常に明確に示していると思います。

同様に、ArrayController に「itemController」プロパティが存在することを示す ArrayController のドキュメント: http://emberjs.com/api/classes/Ember.ArrayController.html#property_itemController

ドキュメントをさらに調べると、「lookupItemController」関数の存在にも気付くでしょう: http://emberjs.com/api/classes/Ember.ArrayController.html#method_lookupItemController

これらの関数は、コンテンツをコントローラーの配列として返すという明確な目的のためのものですが、どのように?

最初の要件は、ArrayController をループ内のコンテンツとして直接使用することです。残念ながら、ここから物事が崩壊し始めます。

CollectionViewaを使用できるのは単純な場合だと思うかもしれません。

{{view myCollectionView controllerBinding=myArrayController}}

また

{{view myCollectionView contentBinding=myArrayController}}

しかし、残念ながらそうではありません。別のコントローラーのルートでコントローラーをレンダリングしている状況ではなおさらです。CollectionView は ArrayController とその「itemControllerClass」の間の関係を保持しません

@jeremy-green が指摘しているように、これを機能させる唯一の方法は次のとおりです。

{{#each myFooArray itemController="foo"}}
  Hi! My attr is {{attr}}
{{/each}}

より完全な例は次のようになります。

<ol class="foo-item-list">
  {{#each controllers.foo_items}}
    <li>{{ view "foo" }}</li>
  {{/each}}
</ol>

プロパティまたは定義済みApp.FooItemsControllerのいずれかがあります。itemControllerlookupItemController

残念ながら、この状況では CollectionViewのtagNameまたはプロパティを使用する利点が失われます。emptyView「ArrayView」が作成された場合、この状況に両方の長所がもたらされることを願っています!

于 2013-09-18T13:59:47.873 に答える