AngularJS: ng-show / ng-hide не работает с интерполяцией `{{ }}`

Я пытаюсь показать / скрыть некоторый HTML, используя ng-show а также ng-hide функции, предоставляемые AngularJS.

Согласно документации, соответствующее использование этих функций выглядит следующим образом:

ngHide - {выражение} - если выражение истинно, то элемент отображается или скрывается соответственно. ngShow - {выражение} - если выражение истинно, то элемент отображается или скрывается соответственно.

Это работает для следующего варианта использования:

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

Однако, если мы используем параметр из объекта в качестве выражения, то ng-hide а также ng-show даны правильные true/false значение, но значения не рассматриваются как логическое значение, поэтому всегда возвращайте false:

Источник

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

Результат

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

Это либо ошибка, либо я делаю это неправильно.

Я не могу найти какую-либо относительную информацию о ссылках на параметры объекта в виде выражений, поэтому я надеялся, что кто-нибудь с лучшим пониманием AngularJS сможет мне помочь?

7 ответов

Решение

foo.bar ссылка не должна содержать фигурные скобки:

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

Угловые выражения должны быть внутри фигурных скобок, в отличие от угловых директив.

Смотрите также Понимание угловых шаблонов.

Вы не можете использовать {{}} при использовании угловых директив для связывания с ng-model но для привязки неугловых атрибутов вам придется использовать {{}}..

Например:

ng-show="my-model"
title = "{{my-model}}"

Попробуйте обернуть выражение:

$scope.$apply(function() {
   $scope.foo.bar=true;
})
<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>

Поскольку ng-show это угловой атрибут, я думаю, нам не нужно ставить оценки цветов ({{}})..

Для атрибутов, таких как class нам нужно заключить переменные в скобки для оценки цветов ({{}}).

Удалите {{}} фигурные скобки вокруг foo.bar, потому что угловые выражения нельзя использовать в угловых директивах.

Для получения дополнительной информации: https://docs.angularjs.org/api/ng/directive/ngShow

пример

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

Если вы хотите показать / скрыть элемент на основе состояния одного {{expression}}, вы можете использовать ng-switch:

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

Абзац будет отображаться, когда foo.bar равен true, скрыт, когда false.

Другие вопросы по тегам