我有一排复选框,每次只能选择一个,如果您单击已选中的复选框,则其状态应该翻转。因此,如果它被选中并且您单击它,则应取消选中,反之亦然。
模型
this.models = [
{name: 'blah', defaulted: false},
{name: 'fdsf', defaulted: false},
...
]
模板
<input
type="checkbox"
ng-repeat="model in vm.models"
ng-checked="model.defaulted === true"
ng-change="vm.setDefault($index)"
ng-model="model.defaulted" />
a. 这个不起作用,模型没有更新
http://embed.plnkr.co/O275a9O7y60NuimFYdYi?show=preview
this.setDefault = (j) => this.models = this.models.map((m, i) => {
return j === i
? Object.assign({}, m, {defaulted: !m.defaulted})
: Object.assign({}, m, {defaulted: false})
})
b. 在这个例子中模型更新正确,但是你无法通过再次点击复选框来取消选择(因此在示例a中出现了!m.defaulted
)
http://embed.plnkr.co/MOBuN06R0hmcnpGu01Z7?show=preview
// this works, but now you can't uncheck a box that is checked
this.setDefault = (j) => this.models = this.models.map((m, i) => {
return j === i
? Object.assign({}, m, {defaulted: true})
: Object.assign({}, m, {defaulted: false})
})
需要一种不使用单选框的解决方案
Object.assign
的概念。 - Pankaj ParkarArray.prototype.map()
覆盖models
数组,这对性能更好。如果OP看到了这个,我不介意他们这样做。 - Alon Eitan