Angularjs 将ngTrueValue和ngFalseValue设置为数字
更新:这个问题对于最新版本已经过时,请参阅tsh对此帖子的评论Angularjs 将ngTrueValue和ngFalseValue设置为数字,angularjs,checkbox,angular-ngmodel,Angularjs,Checkbox,Angular Ngmodel,更新:这个问题对于最新版本已经过时,请参阅tsh对此帖子的评论 我已将复选框绑定到一个值: <input type="checkbox" ng-model="checkbox" ng-true-value="1" ng-false-value="0" /> 但是,最初复选框不显示为选中。如果我将$scope.checkbox的初始值更改为“1”,则会更改。() 我尝试过各种变化: ng-true-value="{{1}}" ng-true-value="{{Number(1)}}
我已将复选框绑定到一个值:
<input type="checkbox" ng-model="checkbox" ng-true-value="1" ng-false-value="0" />
但是,最初复选框不显示为选中。如果我将$scope.checkbox的初始值更改为“1”
,则会更改。()
我尝试过各种变化:
ng-true-value="{{1}}"
ng-true-value="{{Number(1)}}"
ng-true-value="{{parseInt('1')}}"
它们都不起作用。如何将参数视为数字?HTML属性没有任何类型。它们不能包含任何其他内容,然后是一个字符串,因此它始终是一个字符串。故事结束了
在HTML属性中,无法区分1
和“1”
。Angular试图跟上这一点,因此只有字符串可以工作。您可以使用,如果表达式是truthy,那么将在元素上设置特殊属性“checked”
<input type="checkbox"
ng-model="checkbox"
ng-true-value="1"
ng-false-value="0"
ng-checked="checkbox == 1" />
我已经为此制定了指令,似乎效果不错:
angular.module('app').directive('cdTrueValue', [function() {
return {
restrict: 'A',
require: 'ngModel',
link: function(scope, element, attrs, ngModel) {
ngModel.$parsers.push(function(v){
return v ? scope.$eval(attrs.cdTrueValue) : scope.$eval(attrs.cdFalseValue);
});
ngModel.$formatters.push(function(value) {
return value === scope.$eval(attrs.cdTrueValue);
});
}
};
}]);
用法:
<input type="checkbox" ng-model="checkbox" cd-true-value="1" cd-false-value="0" />
上面的第一种方法非常好。那很好。如果您需要使用动态模型,您也可以使用ng change指令(例如,与ID或编号链接-以防您想使用您事先不知道的ID)。只需将模型作为参数传递:ng change=“fooBar(model[ID]),捕获控制器函数并使用编号(model[ID])重新键入。这就是将true转换为1,将false转换为0,您可以使用它 对不起,我应该添加更多。。。再次检查,如果将范围选择更改为“1”,则它将正常工作。新来者注意:这个问题已经过时了,因为ng true value
已被更改为一个表达式,在angular的更新(但不是很新)版本中,一切都应该按照OP的预期工作。这种方法不需要ng true value或ng false value谢谢,ng checked=“checkbox==1”
工作得很好如果有人遇到类似问题,可以使用ng true value=“'1'”-就像文档中一样。此外,据我所知,ngChecked和ngModel不应该一起使用。这不会导致未定义的行为吗?ngChecked
的文档警告:“请注意,此指令不应与ngModel
一起使用,因为这可能导致意外行为。”
添加ngModel.$formatters.push(函数(值){return value==scope.$eval(attrs.cdTrueValue);})代码>在链接函数中,使其在从加载值时显示正确的复选框状态model@Luke谢谢,你试过了吗?我试过了。我发现的唯一问题是,指令必须命名为<'input'
,否则指令的顺序错误,解析器和格式化程序的创建顺序错误。因此,在您的示例中,'cdTrueValue'<'input'==true
是有效的。但是如果你把它称为“xxTrueValue”
东西是按错误的顺序创建的,它会崩溃。
angular.module('app').directive('cdTrueValue', [function() {
return {
restrict: 'A',
require: 'ngModel',
link: function(scope, element, attrs, ngModel) {
ngModel.$parsers.push(function(v){
return v ? scope.$eval(attrs.cdTrueValue) : scope.$eval(attrs.cdFalseValue);
});
ngModel.$formatters.push(function(value) {
return value === scope.$eval(attrs.cdTrueValue);
});
}
};
}]);
<input type="checkbox" ng-model="checkbox" cd-true-value="1" cd-false-value="0" />