Skip to content

Commit 7ca8817

Browse files
committedDec 30, 2013
fix(ngShow/ngHide): follow javscript truthy/falsy logic
Make ngShow and ngHide follow javascript `truthy`/`falsy` logic and not the custom toBoolean logic Fixes angular#5414 angular#4277 BREAKING CHANGE: The expressions * `<div ng-hide="[]">X</div>` * `<div ng-hide="'f'">X</div>` * `<div ng-hide="'[]'">X</div>` used to be evaluated to `false` and the elements were hidden. The same effect is present for `ng-show` and the elements are now visible If you were previously doing `ng-show="exp"` where `$scope.exp = 'no' // (or 'n' or 'f')`, then instead write `ng-show="exp && exp !== 'no'` (or 'n' or 'f').
1 parent 80e7a45 commit 7ca8817

File tree

3 files changed

+28
-6
lines changed

3 files changed

+28
-6
lines changed
 

‎src/ng/directive/ngShowHide.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -142,8 +142,8 @@
142142
*/
143143
var ngShowDirective = ['$animate', function($animate) {
144144
return function(scope, element, attr) {
145-
scope.$watch(attr.ngShow, function ngShowWatchAction(value){
146-
$animate[toBoolean(value) ? 'removeClass' : 'addClass'](element, 'ng-hide');
145+
scope.$watch('!!(' + attr.ngShow + ')', function ngShowWatchAction(value){
146+
$animate[value ? 'removeClass' : 'addClass'](element, 'ng-hide');
147147
});
148148
};
149149
}];
@@ -291,8 +291,8 @@ var ngShowDirective = ['$animate', function($animate) {
291291
*/
292292
var ngHideDirective = ['$animate', function($animate) {
293293
return function(scope, element, attr) {
294-
scope.$watch(attr.ngHide, function ngHideWatchAction(value){
295-
$animate[toBoolean(value) ? 'addClass' : 'removeClass'](element, 'ng-hide');
294+
scope.$watch('!!(' + attr.ngHide + ')', function ngHideWatchAction(value){
295+
$animate[value ? 'addClass' : 'removeClass'](element, 'ng-hide');
296296
});
297297
};
298298
}];

‎test/BinderSpec.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,7 @@ describe('Binder', function() {
272272
$rootScope.hidden = 'false';
273273
$rootScope.$apply();
274274

275-
assertVisible(element);
275+
assertHidden(element);
276276

277277
$rootScope.hidden = '';
278278
$rootScope.$apply();
@@ -291,7 +291,7 @@ describe('Binder', function() {
291291
$rootScope.show = 'false';
292292
$rootScope.$apply();
293293

294-
assertHidden(element);
294+
assertVisible(element);
295295

296296
$rootScope.show = '';
297297
$rootScope.$apply();

‎test/ng/directive/ngShowHideSpec.js

+22
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,17 @@ describe('ngShow / ngHide', function() {
2828
$rootScope.$digest();
2929
expect(element).toBeShown();
3030
}));
31+
32+
it('should follow javascript `truthy`/`falsy` logic', inject(function($rootScope, $compile) {
33+
var cases = ['[]', 'f', [], [''], 'false', {}, function() {}, function(f) {}, 0, false, null, undefined, '', NaN];
34+
element = jqLite('<div ng-show="exp"></div>');
35+
element = $compile(element)($rootScope);
36+
angular.forEach(cases, function(value) {
37+
$rootScope.exp = value;
38+
$rootScope.$digest();
39+
expect(element)[value ? 'toBeShown' : 'toBeHidden']();
40+
});
41+
}));
3142
});
3243

3344
describe('ngHide', function() {
@@ -39,6 +50,17 @@ describe('ngShow / ngHide', function() {
3950
$rootScope.$digest();
4051
expect(element).toBeHidden();
4152
}));
53+
54+
it('should follow javascript `truthy`/`falsy` logic', inject(function($rootScope, $compile) {
55+
var cases = ['[]', 'f', [], [''], 'false', {}, function() {}, function(f) {}, 0, false, null, undefined, '', NaN];
56+
element = jqLite('<div ng-hide="exp"></div>');
57+
element = $compile(element)($rootScope);
58+
angular.forEach(cases, function(value) {
59+
$rootScope.exp = value;
60+
$rootScope.$digest();
61+
expect(element)[value ? 'toBeHidden' : 'toBeShown']();
62+
});
63+
}));
4264
});
4365
});
4466

0 commit comments

Comments
 (0)