2013-02-07 48 views
7

我使用的是烬1.0.0-pre4。我应该在哪里保持列表的选择状态?

我想显示一个模型实例列表。用户应该能够通过点击在每行中呈现的按钮或复选框来选择多个列表条目。

我设法显示列表。但我不知道如何管理选择状态。当我将{{view Ember.Checkbox checkedBinding="isSelected"}}放入模板中时,选择状态将保留在我的模型中。但我不认为这是最好的地方。我认为选择状态属于控制器或视图状态。

你能告诉我存储和访问(多个)列表选择状态的最佳方式吗?

回答

8

的方法之一是刚在控制器中的第二个列表:

App.FooController = Ember.ArrayController.create({ 
    selectedContent: [], 
    selectToggle: function(event) { 
    var selectedContent; 
    selectedContent = this.get(selectedContent); 
    if (selectedContent.contains(event.context)) { 
     return this.set('selectedContent', selectedContent.without(event.context)); 
    } else { 
     return this.get('selectedContent').push(event.context); 
    } 
    } 
}); 

<script type="text/x-handlebars" data-template-name="index"> 
    <ul> 
    {{#each foo in controller}} 
      <li {{action selectToggle foo}}>{{foo.name}}</li> 
    {{/each}} 
    </ul> 
</script> 

这只是维持在控制器单独列出,并推动移除基于/上是否被选择的项目。

您也可以使用Ember.ObjectProxy通过“isSelected”属性来增加foo对象的值。

App.FooController = Ember.ArrayController.create({ 
    selectedContent: @get('content').map(function(item){ 
    Ember.ObjectProxy.create({ 
     content: item 
     isSelected: false 
    }); 
    }); 
}); 

<script type="text/x-handlebars" data-template-name="index"> 
    <ul> 
    {{#each foo in controller.selectedContent}} 
      <li {{bindAttr class= "foo.isSelected"}}{{action selectToggle foo}}>{{foo.name}}</li> 
    {{/each}} 
    </ul> 
</script> 

然后在你的selectToggle方法中,你恰好设置foo的isSelected属性。

+0

非常感谢Andre。我今天会尝试。你能否也请告诉我Ember.ArrayProxy的解决方案是怎么样的?我想知道Ember的所有可能性,以便能够为这个和未来的问题选择正确的解决方案。 – Marc

+0

您能否告诉我如何从模板访问selectedContent列表,例如使用不同样式渲染选定的行? – Marc

+0

这样做你需要使用ObjectProxy方法。我已经更新了答案。 –

相关问题