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 回答