Каков наилучший способ условного применения атрибутов в AngularJS?
Мне нужно иметь возможность добавлять, например, «contenteditable» к элементам, на основе булевой переменной в области.
Пример использования:
{{content.title}}
Результатом будет добавление contenteditable = true в элемент, если для параметра $scope.editMode
установлено значение true
. Есть ли какой-то простой способ реализовать это поведение classа ng-типа? Я рассматриваю возможность написания директивы и обмена, если нет.
- Как автокапитализировать первый символ в поле ввода в AngularJS?
- Как установить динамический controller для директив?
- Недопустимое использование директивы ngTransclude в шаблоне
- $ apply vs $ digest при тестировании директивы
- Пользовательская форма проверки валидации для сравнения двух полей
Изменить: я вижу, что, похоже, есть некоторые сходства между моей предложенной директивой attrs и ng-bind-attrs, но она была удалена в 1.0.0.rc3 , почему?
- Когда в пользу ng-if vs. ng-show / ng-hide?
- Можете ли вы изменить templateUrl на лету?
- В чем разница между ng-app и data-ng-app?
- Экран загрузки Angularjs по запросу ajax
- Установите фокус на первый недопустимый ввод в форме AngularJs
- Угловые директивы - когда и как использовать компиляцию, controller, предварительную ссылку и пост-ссылку
- Предварительный просмотр изображения перед загрузкой Angularjs
- Доступ к атрибутам из директивы AngularJS
Я использую следующее, чтобы условно установить class attr, когда ng-class не может использоваться (например, при стилизации SVG):
ng-attr-class="{{someBoolean && 'class-when-true' || 'class-when-https://stackoverflow.com/questions/15696416/what-is-the-best-way-to-conditionally-apply-attributes-in-angularjs/false' }}"
Такой же подход должен работать и для других типов атрибутов.
(Я думаю, вам нужно быть на последней неустойчивой Угловой, чтобы использовать ng-attr-, я сейчас на 1.1.4)
Вы можете префикс атрибутов с помощью ng-attr
для выражения углового выражения. Когда результат неопределенных выражений удаляет значение из атрибута.
Hello World
Будет производить (когда значение ложно)
Hello World
Поэтому не используйте https://stackoverflow.com/questions/15696416/what-is-the-best-way-to-conditionally-apply-attributes-in-angularjs/false
потому что это приведет к появлению слова «https://stackoverflow.com/questions/15696416/what-is-the-best-way-to-conditionally-apply-attributes-in-angularjs/false» в качестве значения.
Hello World
При использовании этого трюка в директиве. Атрибуты для директивы будут ложными, если они не имеют значения.
Например, вышеизложенное будет ложным.
function post($scope, $el, $attr) { var url = $attr['href'] || https://stackoverflow.com/questions/15696416/what-is-the-best-way-to-conditionally-apply-attributes-in-angularjs/false; alert(url === https://stackoverflow.com/questions/15696416/what-is-the-best-way-to-conditionally-apply-attributes-in-angularjs/false); }
Я получил эту работу, жестко установив атрибут. И контроль применимости атрибута с использованием логического значения для атрибута.
Вот fragment кода:
Надеюсь, это поможет.
В последней версии Angular (1.1.5) они include условную директиву ngIf
. Он отличается от ngShow
и ngHide
тем, что элементы не скрыты, но вообще не включены в DOM. Они очень полезны для компонентов, которые являются дорогостоящими для создания, но не используются:
{{content.title}}
Чтобы получить атрибут для отображения определенного значения на основе логической проверки или полностью исключить, если ошибка boolean не удалась, я использовал следующее:
ng-attr-example="{{params.type == 'test' ? 'itWasTest' : undefined }}"
Пример использования:
или
на основе значения params.type
{{content.title}}
будет производить, когда isTrue = true:
{{content.title}}
и когда isTrue = https://stackoverflow.com/questions/15696416/what-is-the-best-way-to-conditionally-apply-attributes-in-angularjs/false:
{{content.title}}
Я на самом деле написал патч, чтобы сделать это несколько месяцев назад (после того, как кто-то спросил об этом в #angularjs на freenode).
Вероятно, он не будет объединен, но он очень похож на ngClass: https://github.com/angular/angular.js/pull/4269
Если он объединяется или нет, существующий материал ng-attr- *, вероятно, подходит для ваших нужд (как указывали другие), хотя он может быть немного clunkier, чем более функциональные функции ngClass, которые вы предлагаете.
Что касается принятого решения, то, опубликованного Эшли Дэвис, описанный метод все еще печатает атрибут в DOM, независимо от того, что значение, которое оно было назначено, не определено.
Например, при настройке поля ввода как с ng-моделью, так и с атрибутом value:
Независимо от того, что стоит за myValue, атрибут value все еще печатается в DOM, таким образом, интерпретируется. Затем Ng-модель становится переопределенной.
Немного неприятно, но используя ng-if делает трюк:
Я бы рекомендовал использовать более подробную проверку внутри директив ng-if 🙂
Также вы можете использовать выражение, подобное этому:
Для проверки поля ввода вы можете:
Это применит атрибут max
до 100
только если discountType
определяется как %
На всякий случай вам понадобится решение для Angular 2, тогда его простое использование связывания свойств, как показано ниже, например, вы хотите сделать ввод только для чтения условно, а затем добавить квадратные скобки, а затем добавить знак и выражение.