我有一个对象列表,存储在arrayController中并使用#each
宏在视图上呈现
{{#each item in controller}}
{{view App.ItemView}}
{{/each}}
每个项目视图都具有依赖于用户操作的类名绑定。例如:
App.ItemView = Ember.View.extend {
classNameBindings: ['isSelected:selected']
}
isSelected
取决于每个项目的状态:我必须将所选项目存储在某处,并在触发点击事件时将其与新选择的项目进行比较。
问题是:我应该在哪里计算这个isSelected
属性?在itemsController
?在itemController
?直接在每个itemView?
答案 0 :(得分:3)
对我而言,将它放入视图中是有意义的,因为它实际上是一个显示问题。
你在这里有一个例子:http://jsfiddle.net/MikeAski/r6xcA/
<强>车把强>:
<script type="text/x-handlebars" data-template-name="items">
{{#each item in controller}}
{{view App.ItemView contentBinding="item"}}
{{/each}}
</script>
<script type="text/x-handlebars" data-template-name="item">
Item: {{item.label}}
</script>
<强>的JavaScript 强>:
App.ItemsController = Ember.ArrayController.extend({
selected: null
});
App.ItemsView = Ember.View.extend({
templateName: 'items'
});
App.ItemView = Ember.View.extend({
templateName: 'item',
classNameBindings: ['isSelected:selected'],
isSelected: function() {
var item = this.get('content'),
selected = this.getPath('controller.selected');
return item === selected;
}.property('item', 'controller.selected'),
click: function() {
var controller = this.get('controller'),
item = this.get('content');
controller.set('selected', item);
}
});
App.ItemsView.create({
controller: App.ItemsController.create({
content: [{ label: 'My first item' },
{ label: 'My second item' },
{ label: 'My third item' }]
})
}).append();
答案 1 :(得分:0)
听起来你需要两件事 - 项目本身的一个isSelected
属性(模型)回答问题,“这个项目是否被选中?”,以及selectedItem
属性{ {1}},它回答了问题“选择了哪个项目?”模型上的属性只是一个get / set;您可以通过过滤itemsController
为真的项目列表来计算itemsController.selectedItem
,或者您可以使用某些代码明确设置它以取消选择以前未选择的项目。