examples forms angularjs ng-show

forms - examples - ng-show condition



ng-show="true" pero todavĂ­a tiene class="ng-hide" (1)

Soy nuevo en AngularJS, por lo que puede haber una resolución simple para mi problema. He estado trabajando en esta forma. Tengo dos entradas, una para el número de puertas y una para el número de ventanas. Luego tengo varios divs que quiero mostrar si cumplen una cierta cantidad de puertas y ventanas totales. Cuando ingreso números en la entrada, el ng-show se resuelve en "verdadero". Pero el elemento todavía tiene la clase de "ng-hide" que todavía lo deja oculto.

Aquí hay una muestra de mi código:

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

Aquí está la salida cuando entro 3 puertas y 4 ventanas:

<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 toma una expresión angular para que no desee las llaves dobles.

Esto funcionará para ti:

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

demo violín

Para entender por qué echemos un vistazo al código fuente de ngShow :

var ngShowDirective = [''$animate'', function($animate) { return function(scope, element, attr) { scope.$watch(attr.ngShow, function ngShowWatchAction(value){ $animate[toBoolean(value) ? ''removeClass'' : ''addClass''](element, ''ng-hide''); }); }; }];

La clave es que pone un reloj en attr.ngShow . Cuando establece ese atributo en {{(doors + windows) < 6}} lo primero que sucede es que se evalúa la expresión en las llaves dobles. En su caso, las puertas y ventanas comienzan undefined por lo que la expresión se evalúa como false . Luego, se pasa false al atributo. Por lo tanto, un $watch se coloca en false y cada $digest cycle cycle false se comprueba, y false sigue siendo false para que la función de reloj nunca se ejecute.

Lo importante a tener en cuenta es que el atributo en sí no se está viendo, pero el valor que se pasó inicialmente se mira. Entonces, aunque luego cambies el atributo a "verdadero", y veas ese cambio en el html, el reloj nunca lo notará.

Cuando, en cambio, pasamos (doors + windows) < 6 como attr.ngShow luego en cada $digest el $watch evalúa esa expresión. Y siempre que el resultado de la expresión cambie, se llama a la función de reloj y se establece la clase apropiada.