AngularJS:反转checkbox状态
不知何故,通过Angular的魔力,如果你使用ng-model
并提供一个布尔值,你的checkbox将被检查,如果布尔值为true,并且如果为false,则不选中。
<input type="checkbox" ng-model="video.hidden">
虽然这本身是相当莫名其妙的,我实际上是试图扭转检查的状态,因为不像todo.done
意味着框被检查的todo示例,我的模型更像todo.incomplete
。
不幸的是我的第一个猜测没有奏效:
<input type="checkbox" ng-model="!video.hidden">
我处于一个模式已被口授给我的位置,所以我不能改变它,不想在客户端上按摩它(因为我发送客户端对象回到服务器,因为它是在可信的环境中运行)。
更新
这工作在1.3,不给你的string(1.2.xxx给你的string,而不是布尔):
<input type="checkbox" ng-model="video.hidden" ng-true-value="false" ng-false-value="true">
您现在可以不需要自定义指令,angular度支持ng-true-value
和ng-false-value
https://docs.angularjs.org/api/ng/input/input%5Bcheckbox%5D
你的例子应该现在工作<input type="checkbox" ng-model="video.hidden" ng-true-value="false" ng-false-value="true">
我不认为有一种方法可以在模板中完全做到这一点。 最明显的方法是创build一个新的范围variables,手动双重绑定到您的模型值。 如此:
<input type="checkbox" ng-model="videoShowing">
在您的控制器中:
$scope.videoShowing = !$scope.video.hidden; $scope.$watch('video.hidden', function(value) { $scope.videoShowing = !value; }); $scope.$watch('videoShowing', function(value) { $scope.video.hidden = !value; }
你几乎可以使用ng-change的单向绑定,但是这不起作用:
<input type="checkbox" ng-checked="!video.hidden" ng-change="???">
因为ng-change不会将当前值混合到本地范围中。 如果你在一个你可以访问NgModelController的环境中,你可以做一些事情,但是你需要一个自定义的指令。 不难做出修改NgModel的格式化器和分析器的“倒置”属性指令。 我build议,如果你需要大量的倒置checkbox。
编辑
对于后代来说,制造一个“倒置”的属性是非常简单的,不妨做到这一点。 制定指令起初似乎是一种痛苦,但确实是angular度的方式。
someModule.directive('inverted', function() { return { require: 'ngModel', link: function(scope, element, attrs, ngModel) { ngModel.$parsers.push(function(val) { return !val; }); ngModel.$formatters.push(function(val) { return !val; }); } }; });
可能需要设置优先级,或者“不换”而不是推,以确保这些家伙在内置的inputDirective之后运行。
这似乎工作
<input type="checkbox" ng-init = "video.checked = !video.hidden" ng-model ="video.checked" ng-change ="video.hidden = !video.checked"/>
它引入了与video.checked
相反的video.checked
属性,只要checkbox更改值更新。
示例: http : //plnkr.co/edit/7HYht6ubkUUJQ0r3g16m?p=preview
我的解决scheme使用一个指令“否定”,你只需要添加到“input”。 这很简单,并且不需要改变控制器。
angular .module("<< your module >>") .directive('negate', [ function () { return { require: 'ngModel', link: function (scope, element, attribute, ngModelController) { ngModelController.$isEmpty = function(value) { return !!value; }; ngModelController.$formatters.unshift(function (value) { return !value; }); ngModelController.$parsers.unshift(function (value) { return !value; }); } }; } ] );
像这样使用它:
<input type="checkbox" negate ng-model="entity.nologin">
我认为最简单的解决scheme来取得checkbox的选中或取消选中的值是通过添加checkboxinput元素中的ng-init指令,如下所示:
<input type="checkbox" ng-init="video = false" ng-model="video" >
这使checkbox的初始值为false,如果状态未被选中。 在提交表单时,如果取消选中checkbox,则返回(或控制台)的值将为false,而不是“未定义”,否则在检查时为true。
如果您想为true或false状态添加自定义的值,可以使用:
ng-true-value="'custom_true value'"
和
ng-false-value="'custom_false value'"
在input元素内部。 喜欢 :
<input type="checkbox" ng-init="video = false" ng-model="video" ng-true-value="'custom_true value'" ng-false-value="'custom_false value'">
我的解决scheme非常简单:只需使用ng-true-value / ng-false-value并将false设置为ng-true-value,将true设置为ng-false-value即可颠倒function。
<input type="checkbox" ng-model="<<-- Your Model -->> " ng-true-value="false" ng-false-value="true">
- AngularJS风格指南 – Todd Motto vs John Papa vs Minko Gechev
- AngularJS – 我如何做一个完整的页面加载redirect?
- angular度filter的作品,但会导致“达到$ 10消化迭代”
- 如何从chrome控制台angular度访问$ scopevariables
- ngModel。$ modelValue和ngModel。$ viewValue之间有什么区别
- 从数据库编译dynamicHTMLstring
- 为什么不能在具有隔离范围的指令的模板中访问$ rootScope?
- angularjs $ window.height是未定义的
- 我不明白在控制器中使用$注入