js -将多个复选框绑定到单个数组
Ember.js - multiple checkeboxes bound to a single array
我有一个复选框列表,我只能允许用户选择两个。然后,我需要将这些选中的复选框的值添加到数组中。如果用户不选择相应的复选框,我还需要能够删除这些值。
我读过这个问题如何在Ember.js中推送/弹出数组?它可能在正确的轨道上,但不是我所需要的。
我:
<label {{bindAttr class='checked:active'}}>
{{view Ember.Checkbox valueBinding='id' }}
Select
</label>
我还需要"active"类在被选中时应用。
想法?
这可能会给你一个如何继续的想法。
这是一个工作演示。
下面是相关代码。您可能希望将其作为一个组件分离出来以实现可重用性。
App.IndexController = Em.ArrayController.extend({
selectedOptions: [],
optionsSelected: function() {
console.log(this.get('selectedOptions').toArray());
}.observes('selectedOptions.[]')
});
App.DeveloperController = Ember.ObjectController.extend({
isChecked: false,
resetFlag: false,
_isCheckedChanged: function(){
if(!this.get('resetFlag')) {
var isChecked = this.get('isChecked');
if(isChecked) {
if(this.get('parentController.selectedOptions').length >= 2) {
this.set('resetFlag', true);
this.set('isChecked', false);
} else {
this.get('parentController.selectedOptions')
.addObject(this.get('content'));
}
} else {
this.get('parentController.selectedOptions')
.removeObject(this.get('content'));
}
} else {
this.set('resetFlag', false);
}
}.observes('isChecked')
});
<script type="text/x-handlebars" data-template-name="index">
<ul>
{{#each item in model itemController="developer"}}
<label {{bindAttr class='checked:active'}}>
{{view Ember.Checkbox checkedBinding="isChecked"}}
{{item.content}}
</label>
{{/each}}
</ul>
</script>
这是一个基于Ember Components的可行解决方案。
它不处理所有的边缘情况,例如,绑定值在组件渲染后改变,但它做了基本的。如果需要,可以很容易地扩展。
可以使用Ember.A()
来构造数组,以便它具有addObject
等。
组件:
App.ArrayCheckboxComponent = Em.Component.extend({
value: null # included in array when checked
array: null # array to bind to
_checked: null # boolean
init: ->
@_super.apply(this, arguments)
array = @get('array')
unless array.addObject && array.removeObject && array.contains
throw new Error('Array used for `ArrayCheckboxComponent` must implement addObject/removeObject')
if array.contains(@get('value'))
@set('_checked', true)
else
@set('_checked', false)
checkedDidChange: (->
value = @get('value')
array = @get('array')
if @get('_checked')
array.addObject(value)
else
array.removeObject(value)
).observes('_checked')
})
组件模板:
{{view Em.Checkbox checkedBinding='_checked'}}
用法:
{{array-checkbox value='item1' arrayBinding='path.to.array'}}
更多关于组件的信息:
http://emberjs.com/guides/components/相关文章:
- 如何在没有jQuery的情况下模拟按名称命名的事件或解除单个事件的绑定
- Knockout.js用单个json对象绑定一个可观察对象
- 绑定事件发射器上的单个事件
- 挖空:数据绑定到 foreach 绑定中的单个文本框
- KnockoutJS与jQuery数据表和绑定插件,行单击传递整个数组而不是单个模型
- jQuery each - 绑定到所有元素而不是单个元素
- 挖空 要在单个标记中显示的文本绑定
- 使用角度谷歌地图无法将点击事件绑定到用于显示单个窗口的标记
- 在单个 .on() 调用中绑定多个事件
- 从 NG 绑定结果访问单个对象
- 更换所有元件's单击与单个文档的绑定.on('单击')
- KnockOut数组绑定到单个索引
- 如何将同一类型的多个事件绑定到单个元素
- Knockout Js-将json数组中的单个项绑定到元素
- Knockout js:用于绑定对象而不是单个值的代码
- 如何将多个方法绑定到单个事件
- 绑定带有单个记录的简单视图模型
- Javascript多个事件绑定到单个函数,导致多个函数执行
- 使用流星和Angular为单个文档提供3- way数据绑定,而不是集合
- React + Flux——将输入绑定到单个“模型”的嵌套组件