我在视图中遇到点击处理程序时遇到问题。它没有返回集合的预期成员,而是返回整个集合。
我创建了一个jsfiddle来证明这个问题。我有一个ArrayController,其内容我预先填充。然后,此控制器的视图将控制器的#each帮助程序与另一个视图一起使用:
{{#each controller}}
{{view App.ActivityListItemView}}
{{/each}}
这是有效的,因为我在页面上看到了项目的名称,并且可以单击它。
问题在于click处理程序 - 如果我是@get('content'),则返回父控制器的内容。如何获取被点击的项目?如果您查看jsfiddle中的控制台输出,您将看到问题。我认为这是一个背景问题?
我已尝试将contentBinding =“this”添加到视图中:
{{#each controller}}
{{view App.ActivityListItemView contentBinding="this"}}
{{/each}}
但这没什么区别。
感谢,
马丁
答案 0 :(得分: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
答案 1 :(得分:0)
是的,我有这个工作,我认为由于缺乏对contentBinding参数的理解而引发了这个问题。基本上我已经改为在#each块中使用特定名称'activityBinding',然后明确地引用click处理程序中的活动。有关正常工作的演示,请参阅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)