Каков наилучший способ условного применения атрибутов в AngularJS?

Мне нужно иметь возможность добавлять, например, «contenteditable» к элементам, на основе булевой переменной в области.

Пример использования:

{{content.title}}

Результатом будет добавление contenteditable = true в элемент, если для параметра $scope.editMode установлено значение true . Есть ли какой-то простой способ реализовать это поведение classа ng-типа? Я рассматриваю возможность написания директивы и обмена, если нет.

Изменить: я вижу, что, похоже, есть некоторые сходства между моей предложенной директивой attrs и ng-bind-attrs, но она была удалена в 1.0.0.rc3 , почему?

Я использую следующее, чтобы условно установить 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, тогда его простое использование связывания свойств, как показано ниже, например, вы хотите сделать ввод только для чтения условно, а затем добавить квадратные скобки, а затем добавить знак и выражение.

  
  • Отложить угловое выполнение часов после $ digest (повышение DOM-события)
  • вызов метода родительского controllerа из директивы в AngularJS
  • Понимание опции transclude определения директивы?
  • угловой ng-bind-html и директива внутри него
  • Угловой ng-стиль с условным выражением
  • Угловая JS: Какова потребность в функции ссылки директивы, когда у нас уже есть controller директивы с объемом?
  • получить исходный элемент из ng-click
  • угловая директива, инкапсулирующая задержку для ng-change
  • Использование углового фильтра в входном элементе
  • Как получить доступ к родительской области из пользовательской директивы * с помощью собственной области * в AngularJS?
  • Как использовать функцию «replace» для пользовательских директив AngularJS?
  • Давайте будем гением компьютера.