0

ビューのクリックハンドラーに問題があります。コレクションの予想されるメンバーではなく、コレクション全体を返します。

この問題を示すためにjsfiddleを作成しました。ArrayControllerがあり、そのコンテンツを事前に入力しています。次に、このコントローラーのビューは、別のビューを持つコントローラーの#eachヘルパーを使用します。

{{#each controller}}
  {{view App.ActivityListItemView}}
{{/each}}

これは、ページにアイテムの名前が表示され、クリックできるという点で機能します。

問題はクリックハンドラーにあります-@get('content')の場合、親コントローラーのコンテンツが返されます。クリックされたアイテムを取得するにはどうすればよいですか?jsfiddleのコンソール出力を見ると、問題が発生していることがわかります。これはコンテキストの問題だと思いますか?

ビューにcontentBinding="this"を追加してみました:

{{#each controller}}
  {{view App.ActivityListItemView contentBinding="this"}}
{{/each}}

しかし、それは違いはありません。

ありがとう、

マーティン

4

2 に答える 2

1

クリックされたアイテムを取得するにはどうすればよいですか?jsfiddleのコンソール出力を見ると、問題が発生していることがわかります。これはコンテキストの問題だと思いますか?

その通り。contextコントローラのコンテンツではなく、ビューが必要です。それで:

click: (data)->
  console.log 'clicked on an activity'
  selected = @get('context')
  @get('controller').set('selectedActivity', selected)
  console.log(@get('controller').get('selectedActivity.name'))

なんで?

デフォルトでは{{#each}} helper does not create a new controller instance for items in the array. So when you、ビューヘルパーからの@get('controller') `は、コントローラー(この場合は配列コントローラー)が見つかるまでビュー階層を検索します。

アイテムごとに個別のコントローラーが必要な場合はitemController、各ヘルパーに属性を指定できます。http://emberjs.com/api/classes/Ember.Handlebars.helpers.html#method_eachを参照してください。

于 2013-02-28T03:57:00.840 に答える
0

そうです、私はこれを機能させています。contentBinding引数の理解が不足しているために問題が発生したと思います。基本的に、#eachブロック内で「activityBinding」という特定の名前を使用し、クリックハンドラーでアクティビティを明示的に参照するように変更しました。動作するデモについては、 jsfiddleを参照してください。

{{#each controller}}
  {{view App.ActivityListItemView activityBinding="this"}}
{{/each}}

click: ->
  console.log 'clicked on an activity'
  console.log @get('activity.name')
  content = @get('activity')
  @get('controller').set('selectedActivity', content)
于 2013-02-28T03:40:24.230 に答える