Angularjs 将ngTrueValue和ngFalseValue设置为数字

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)}}

更新:这个问题对于最新版本已经过时,请参阅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)}}"
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" />