【发布时间】:2013-02-14 12:39:29
【问题描述】:
我的问题是创建一个角度指令。
我想用一个 ng-model 创建一组复选框。它就像一个位域或标志,即复选框的值从 0、1、2、3 到 n,但对于 ng-model 我只想添加所有选中复选框的 2^value。那么要添加的值是 1, 2, 4, 8, 16, ...
我想知道是否有更好、更正确或更简单的解决方案来解决我的问题。
http://plnkr.co/edit/9h7EkEpDohXTniIDHdc5
在示例中,您可以更改文本框中的值并且检查将被更新,但不是其他方式。有点疯狂,代码在我的开发机器上运行,但不在 Plnkr 中!
app.directive('ngCheckboxFlags', function () {
return {
restrict: 'A',
require: 'ngModel',
link: function (scope, element, attrs, ctrls) {
var flagSum;
var checkboxes = [];
// trigger changes of the ngModel
scope.$watch(attrs.ngModel, function (value) {
flagSum = value;
for (var i = 0, ii = checkboxes.length; i < ii; ++i) {
var checkbox = checkboxes[i];
checkbox.checked = flagSum & (1<<checkbox.value);
}
});
for (var i = 0, inputs = element.find('input[type=checkbox]'), ii = inputs.length; i < ii; ++i)
{
var checkbox = inputs[i];
checkboxes.push(checkbox);
// trigger changes of HTML elements
$(checkbox).bind('change', function () {
flagSum = ctrls.$viewValue ^ (1<<this.value);
console.log(flagSum);
//ERROR: Change not happening, textbox shows old value
scope.$apply(function () {
ctrls.$setViewValue(flagSum);
});
});
}
}
};
});
请提前 胡桃
【问题讨论】:
-
好吧,你的 plunker 没有工作,因为你直接绑定到范围级别。始终绑定到对象属性(范围内对象的)。看到这个来理解我的意思:plnkr.co/edit/jgoMWDssothUlSy1oelP?p=preview。至于您的实际问题,“有没有更好的方法?”,我不是那么专家,所以我会说坚持现在有效的方法。
-
好笑!正是这就是为什么它在我的开发机器中是正确的(我有一个复杂的对象)而不是在 plnkr 上工作。只是想简化我的问题的代码,因此使用了原始类型。以后最好不要这样做:(
标签: checkbox angularjs model-binding angularjs-directive