使用Ember.Select在 Ember.js 中创建选择相对容易。
问题是,如何使用 optgroup 将其变为分组选择。我不认为这是内置的,但我猜对模板进行一些修改是可能的。
使用Ember.Select在 Ember.js 中创建选择相对容易。
问题是,如何使用 optgroup 将其变为分组选择。我不认为这是内置的,但我猜对模板进行一些修改是可能的。
Ember 现在原生支持这一点,但有一些问题。在 1.4.0 中,以下解决方案有效...
这是示例数据:
foos: Ember.A([{value: 'foo', label: 'Foo', group: 'Foos'}, {value: 'bar', label: 'Bar', group: 'Bars'}, {value: 'bar2', label: 'Bar2', group: 'Bars'}, {value: 'foo2', label: 'Foo2', group: 'Foos'}])
这是视图助手:
{{view Ember.Select content=controller.foos optionLabelPath='content.label' optionValuePath='content.value' optionGroupPath='group'}}
如果您只是执行上述操作,您将获得一个如下所示的选择列表:
我可以解决这个问题的唯一方法是首先按分组字段对数组进行排序:
foos: Ember.A([{value: 'foo', label: 'Foo', group: 'Foos'}, {value: 'bar', label: 'Bar', group: 'Bars'}, {value: 'bar2', label: 'Bar2', group: 'Bars'}, {value: 'foo2', label: 'Foo2', group: 'Foos'}]).sortBy("group")
这里的答案有点过时了。Ember 现在支持对内容进行分组。想象一下你有:
App.SomeController = Ember.Controller.extend({
content: [{value: 'foo', label: 'Foo', group: 'Foos'}, {value: 'bar', label: 'Bar', group: 'Bars'}]
})
然后你可以做
Ember.Select contentBinding='content' optionLabelPath='content.label' optionValuePath='content.value' optionGroupPath='group'
注意 optionGroupPath 不做 content.path,只是 path
这是我想出的解决方案。https://gist.github.com/3297425
我不得不制作两个系列。一个分组,另一个只是内容,以便可以选择正确的选项。
groupedServiceCodes = [Ember.Object.create({label: 'Label for optgroup', content: Ember.A()}), …]
然后将 groupedServiceCodes 中的内容展平以保持选择的顺序:
flattenedServiceCodes = [].concat(object.get('content'), …)
这有点小题大做,我认为 Ember 想要一个更好的解决方案,但这对我有用。我很想听听关于改进这一点的想法。
Ember.Select 不支持 optgroups,但您可以通过为其提供新模板和选项的新模板来扩展 Ember.Select。我这样做是为了支持 Ember 中的 selected.js 选择。
Ember 现在支持开箱即用。参考这个 git pull request https://github.com/emberjs/ember.js/pull/2465