【问题标题】:Where should I keep selection state for a list?我应该在哪里保留列表的选择状态?
【发布时间】:2013-01-22 09:11:30
【问题描述】:

我使用的是 ember 1.0.0-pre4。

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

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

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

【问题讨论】:

    标签: list ember.js multi-select


    【解决方案1】:

    一种方法是在控制器中保留第二个列表:

    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 属性。

    【讨论】:

    • 非常感谢,安德烈。我今天会试试的。能否请您告诉我使用 Ember.ArrayProxy 的解决方案如何?我想知道 Ember 中的所有可能性,以便能够为这个以及未来的问题选择正确的解决方案。
    • 能否请您告诉我如何从模板访问 selectedContent 列表,例如以不同的样式呈现选定的行?
    • 这样做你需要使用 ObjectProxy 方法。我已经更新了答案。
    • 非常感谢,安德烈!
    猜你喜欢
    • 2019-08-10
    • 1970-01-01
    • 1970-01-01
    • 2011-07-31
    • 1970-01-01
    • 2022-11-10
    • 2019-06-07
    • 1970-01-01
    • 2014-02-03
    相关资源
    最近更新 更多