我应该在哪里保留选择状态列表?

时间:2013-02-07 00:21:46

标签: list ember.js multi-select

我正在使用ember 1.0.0-pre4。

我想显示一个Model实例列表。用户应该能够通过单击每行中呈现的按钮或复选框来选择任意数量的列表条目。

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

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

1 个答案:

答案 0 :(得分: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属性。