AngularJS: ng-show / ng-hide no funciona con `{}}` interpolación


Estoy tratando de mostrar / ocultar algo de HTML usando las funciones ng-show y ng-hide proporcionadas por AngularJS.

De acuerdo con la documentación, el uso respectivo para estas funciones es el siguiente:

NgHide – {expression} - Si la expresión truth entonces el elemento se muestra u oculta respectivamente. ngShow – {expression} - Si la expresión es verdadera, el elemento se muestra u oculta respectivamente.

Esto funciona para el siguiente caso de uso:

<p ng-hide="true">I'm hidden</p>
<p ng-show="true">I'm shown</p>

Sin embargo, si usamos un parámetro de un objeto como expresión, entonces ng-hide y ng-show reciben la expresión correcta true/false valor pero los valores no son tratados como un booleano por lo que siempre devuelve false:

Fuente

<p ng-hide="{{foo.bar}}">I could be shown, or I could be hidden</p>
<p ng-show="{{foo.bar}}">I could be shown, or I could be hidden</p>

Resultado

<p ng-hide="true">I should be hidden but I'm actually shown</p>
<p ng-show="true">I should be shown but I'm actually hidden</p>

Esto es un error o no estoy haciendo esto correctamente.

No puedo encontrar ninguna información relativa sobre la referencia de parámetros de objeto como expresiones, por lo que estaba esperando que alguien con una mejor comprensión de AngularJS podría ser capaz de ayudarme?

Author: georgeawg, 2012-09-26

7 answers

La referencia foo.bar no debe contener las llaves:

<p ng-hide="foo.bar">I could be shown, or I could be hidden</p>
<p ng-show="foo.bar">I could be shown, or I could be hidden</p>

Las expresiones Angular deben estar dentro de los enlaces entre llaves, mientras que las directivas Angular no lo hacen.

Véase también Comprender las plantillas Angulares.

 373
Author: My Head Hurts,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-09 23:59:14

No se puede usar {{}} cuando se usan directivas angulares para enlazar con ng-model, pero para enlazar atributos no angulares se tendría que usar {{}}..

Eg:

ng-show="my-model"
title = "{{my-model}}"
 31
Author: SHIVANG SANGHI,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-07 06:58:36

Intente envolver la expresión con:

$scope.$apply(function() {
   $scope.foo.bar=true;
})
 18
Author: hrn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-12 19:18:03

Dado que ng-show es un atributo angular creo, no necesitamos poner los corchetes de flores de evaluación ({{}})..

Para atributos como class necesitamos encapsular las variables con corchetes de flor de evaluación ({{}}).

 7
Author: Rajkamal Subramanian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-13 04:14:52
<script src="http://code.angularjs.org/1.2.0-rc.2/angular.js"></script>
<script type="text/javascript">
    function controller($scope) {
        $scope.data = {
            show: true,
            hide: false
        };
    }
</script>

<div ng-controller="controller">
    <div ng-show="data.show"> If true the show otherwise hide. </div>
    <div ng-hide="!(data.hide)"> If true the show otherwise hide.</div>
</div>
 7
Author: Anil Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-07 03:35:50

Retire {{}} las llaves alrededor de foo.porque las expresiones angulares no se pueden usar en directivas angulares.

Para Más: https://docs.angularjs.org/api/ng/directive/ngShow

Ejemplo

  <body ng-app="changeExample">
    <div ng-controller="ExampleController">
    <p ng-show="foo.bar">I could be shown, or I could be hidden</p>
    <p ng-hide="foo.bar">I could be shown, or I could be hidden</p>
    </div>
    </body>

<script>
     angular.module('changeExample', [])
        .controller('ExampleController', ['$scope', function($scope) {
          $scope.foo ={};
          $scope.foo.bar = true;
        }]);
</script>
 0
Author: Vijay Kumar Reddy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-13 20:33:59

Si desea mostrar u ocultar un elemento basado en el estado de una {{expresión}} puede usar ng-switch:

<p ng-switch="foo.bar">I could be shown, or I could be hidden</p>

El párrafo se mostrará cuando foo.la barra es verdadera, oculta cuando es falsa.

 -1
Author: Roberto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-20 15:19:32