I'm new to AngularJS, so there may be a simple resolution to my problem. I've been working on this form. I have two inputs - one is for the number of doors and one is for the number of windows. I then have several divs that I want to show if they meet a certain number of total doors and windows. When I enter numbers into the input, the ng-show resolves to "true". But the element still has the class of "ng-hide" on it which still leaves it hidden.
Here's a sample of my code:
<body ng-app>
Doors: <input type="number" ng-model="doors"><br>
Windows: <input type="number" ng-model="windows"><br>
<div ng-show="{{(doors + windows) < 6}}">
Shows if you have 0-5 doors and windows combined.
</div>
<div ng-show="{{(doors + windows) > 5 && (doors + windows) < 11}}">
Shows if you have 6-10 doors and windows combined.
</div>
<div ng-show="{{(doors + windows) > 10 }}">
Shows if you have more than 10 doors and windows combined.
</div>
</body>
Here's the output when I enter 3 doors and 4 windows:
<div ng-show="false" class="ng-hide">
Shows if you have 0-5 doors and windows combined.
</div>
<div ng-show="true" class="ng-hide">
Shows if you have 6-10 doors and windows combined.
</div>
<div ng-show="false" class="ng-hide">
Shows if you have more than 10 doors and windows combined.
</div>
ngShow
takes an Angular expression so you don't want the double curly braces.This will work for you:
demo fiddle
To understand why let's look at the
ngShow
source code:The key is that it puts a watch on
attr.ngShow
. When you set that attribute to{{(doors + windows) < 6}}
the first thing that happens is the expression in the double curly braces is evaluated. In your case, doors and windows start outundefined
so the expression evaluates tofalse
. Thenfalse
is passed in to the attribute. So a$watch
is placed onfalse
and every$digest
cyclefalse
is checked, andfalse
keeps beingfalse
so the watch function never runs.The important thing to note is that the attribute itself isn't being watched, but the value that was initially passed in is watched. So even though you later change the attribute to "true", and see that change in the html, that's never noticed by the watch.
When, instead, we pass in
(doors + windows) < 6
asattr.ngShow
then on each$digest
the$watch
evaluates that expression. And whenever the result of the expression changes the watch function is called and the appropriate class set.