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.