Мне нужно иметь возможность добавить, например, "contenteditable" к элементам, основываясь на булевой переменной в области видимости.
Пример использования:
<h1 attrs="{'contenteditable=\"true\"': editMode}">{{content.title}}</h1>
Приведет к добавлению contenteditable = true к элементу, если для $scope.editMode
него установлено значение true
. Есть ли какой-нибудь простой способ для реализации этого ng-класса, как поведение атрибутов? Я собираюсь написать директиву и поделиться, если нет.
Изменить: я вижу, что, кажется, есть некоторые сходства между моей предложенной директивой attrs и ng-bind-attrs, но она была удалена в 1.0.0.rc3 , почему так?
angularjs
angularjs-directive
Кеннет Линн
источник
источник
ng-attr="expression"
,contentEditable
директиву.<h1 ng-attr-contenteditable="{{editMode && true : false}}">{{content.title}}</h1>
Ответы:
Я использую следующее, чтобы условно установить класс attr, когда нельзя использовать ng-класс (например, при стилизации SVG):
Тот же подход должен работать для других типов атрибутов.
(Я думаю, что вы должны быть на последнем нестабильном Angular, чтобы использовать ng-attr-, я сейчас на 1.1.4)
источник
ng-attr-
, то компилятор уберет префикс и добавит атрибут со значением, связанным с результатом углового выражения, из исходного значения атрибута.Вы можете добавить к атрибутам префикс,
ng-attr
чтобы оценить угловое выражение. Когда результат выражений не определен, это удаляет значение из атрибута.Будет производить (когда значение ложно)
Так что не используйте,
false
потому что это даст слово «ложь» в качестве значения.При использовании этого трюка в директиве. Атрибуты для директивы будут ложными, если в них отсутствует значение.
Например, приведенное выше будет ложным.
источник
undefined
это особый случай. «При использовании ngAttr используется флаг allOrNothing в $ interpolate, поэтому, если какое-либо выражение в интерполированной строке приводит к неопределенности, атрибут удаляется и не добавляется в элемент».ng-attr-foo
прежнему будет всегда вызыватьfoo
директиву, если она существует, и дажеng-attr-foo
вычислять ееundefined
. обсуждениеЯ получил это работая жесткой настройкой атрибута. И управление применимостью атрибута с использованием логического значения для атрибута.
Вот фрагмент кода:
Надеюсь, это поможет.
источник
В последней версии Angular (1.1.5) они включили условную директиву под названием
ngIf
. Он отличается отngShow
иngHide
в том , что элементы не скрыты, но не включены в DOM вообще. Они очень полезны для компонентов, которые стоят дорого, но не используются:источник
<h1 ng-if="editMode" contenteditable="true"><h1 ng-if="!editMode">
ng-if
создает новую область.ng-if
создает новую область, ноng-show
не делает. Это несоответствие всегда было больным местом для меня. Реакция защитного программирования на это такова: «всегда связывайте что-то, что является точкой в выражении», и это не будет проблемой.Чтобы получить атрибут, отображающий определенное значение на основе логической проверки, или быть полностью опущенным, если логическая проверка завершилась неудачно, я использовал следующее:
ng-attr-example="{{params.type == 'test' ? 'itWasTest' : undefined }}"
Пример использования:
<div ng-attr-class="{{params.type == 'test' ? 'itWasTest' : undefined }}">
Будет ли вывод
<div class="itWasTest">
или<div>
на основе значенияparams.type
источник
<h1 ng-attr-contenteditable="{{isTrue || undefined }}">{{content.title}}</h1>
выдаст когда isTrue = true:
<h1 contenteditable="true">{{content.title}}</h1>
и когда isTrue = false:
<h1>{{content.title}}</h1>
источник
<h1 ng-attr-contenteditable="{{isTrue ? 'row' : undefined}}">{{content.title}} </h1>
<video ng-attr-autoplay="{{vm.autoplay || undefined}}" />
Что касается принятого решения, опубликованного Эшли Дэвисом, описанный метод все еще печатает атрибут в DOM, независимо от того, что значение, которое ему было присвоено, не определено.
Например, при настройке поля ввода как с ng-моделью, так и с атрибутом value:
Независимо от того, что стоит за myValue, атрибут value по- прежнему печатается в DOM, поэтому интерпретируется. Тогда Ng-модель переопределяется.
Немного неприятно, но использование ng-if делает свое дело:
Я бы порекомендовал использовать более детальную проверку внутри директив ng-if :)
источник
Также вы можете использовать такое выражение:
источник
Я на самом деле написал патч для этого несколько месяцев назад (после того, как кто-то спросил об этом в #angularjs на freenode).
Вероятно, он не будет объединен, но он очень похож на ngClass: https://github.com/angular/angular.js/pull/4269
Независимо от того, объединены они или нет, существующий материал ng-attr- *, вероятно, подойдет для ваших нужд (как уже упоминали другие), хотя он может быть немного более грубым, чем предлагаемые вами функции в стиле ngClass.
источник
Для проверки поля ввода вы можете сделать:
Это будет применяться атрибут
max
к100
только , еслиdiscountType
определяется как%
источник
Изменить : Этот ответ относится к Angular2 +! Извините, я пропустил тег!
Оригинальный ответ:
Что касается очень простого случая, когда вы хотите применить (или установить) атрибут, только если было задано определенное входное значение, это так же просто, как
Это так же, как:
(Таким образом, optionValue применяется, если задано, иначе выражение ложно, а атрибут не применяется.)
Пример: у меня был случай, когда я позволил применить цвет, но также и произвольные стили, где атрибут цвета не работал, поскольку он уже был установлен (даже если цвет @Input () не был задан):
Таким образом, «style.color» был установлен только тогда, когда там присутствовал атрибут color, иначе можно было бы использовать атрибут color в строке «styles».
Конечно, это также может быть достигнуто с
и
источник
На всякий случай, если вам нужно решение для Angular 2, тогда его просто, используйте привязку свойства, как показано ниже, например, вы хотите сделать входные данные только для чтения условно, а затем добавьте в квадратных скобках атрибут attrbute, за которым следует знак = и выражение.
источник
Был в состоянии заставить это работать:
Здесь хорошо то, что если item.isSelected равно false, атрибут просто не отображается.
источник