Применить директиву условно
Я использую Материал 2, чтобы добавить md-raised-button
. Я хочу применять эту директиву только в том случае, если определенное условие становится истинным.
Например:
<button md-raised-button="true"></button>
Другой пример:
Я создал базовую динамическую реактивную форму в плункере.
Я использую директиву formArrayName
реактивной формы для массива элементов управления.
Я хочу применять директиву formArrayName
, только если конкретное условие становится истинным, в противном случае не добавляйте директиву formArrayName
.
Вот плункерная ссылка.
Ответы
Ответ 1
Я не знаю, можете ли вы применять директивы на основе условия, но обходной путь будет иметь 2 кнопки и отображать их на основе условия.. p >
<button *ngIf="!condition"></button>
<button *ngIf="condition" md-raised-button></button>
Изменить: возможно этот будет полезен.
Ответ 2
Вы можете использовать следующий метод:
<button [attr.md-raised-button]="condition? '': null"></button>
Применил то же самое к вашему поршню: fork
Обновить:
Как condition? '': null
condition? '': null
работает как значение:
Когда это пустая строка (''
), оно становится attr.md-raised-button=""
, когда его null
атрибут не будет существовать.
Обновление: обновление плункера: форк (исправлены проблемы с версией, обратите внимание, что вопрос изначально был основан на angular 4)
Ответ 3
Как уже отмечалось, это не представляется возможным. Одна вещь, которая может быть использована, по крайней мере, для предотвращения дублирования, - это ng-template
. Это позволяет вам извлечь содержимое элемента, затронутого ветвлением ngIf
.
Если вы, например, хотите создать иерархический компонент меню, используя Angular Материал:
<!-- Button contents -->
<ng-template #contentTemplate>
<mat-icon *ngIf="item.icon != null">{{ item.icon }}</mat-icon>
{{ item.label }}
</ng-template>
<!-- Leaf button -->
<button *ngIf="item.children == null" mat-menu-item
(click)="executeCommand()"
[disabled]="enabled == false">
<ng-container *ngTemplateOutlet="contentTemplate"></ng-container>
</button>
<!-- Node button -->
<ng-container *ngIf="item.children != null">
<button mat-menu-item
[matMenuTriggerFor]="subMenu">
<ng-container *ngTemplateOutlet="contentTemplate"></ng-container>
</button>
<mat-menu #subMenu="matMenu">
<menu-item *ngFor="let child of item.children" [item]="child"></menu-item>
</mat-menu>
</ng-container>
Здесь условно применяемая директива matMenuTriggerFor
, которая должна применяться только к элементам меню с дочерними элементами. Содержимое кнопки вставляется в оба места через ngTemplateOutlet
.
Ответ 4
Это может зайти поздно, но это жизнеспособный и изящный способ условного применения директивы.
В классе директивы создайте входную переменную:
@Input('myDirective') options: any;
При применении директивы задайте свойство apply входной переменной:
<div [myDirective] = {apply: someCondition}></div>
В методе директивы проверьте переменную this.options.apply и примените логику директивы на основе условия:
ngAfterViewInit(): void {
if (!this.options.apply) {
return;
}
// directive logic
}
Ответ 5
Как уже говорили другие, directives
не могут применяться динамически.
Однако, если вы просто хотите переключить стиль md-button
с плоской на поднятую, то это
<button md-button [class.mat-raised-button]="isRaised">Toggle Raised Button</button>
сделал бы трюк. Plunker
Ответ 6
В настоящее время существует способ NO
условно применить директиву к компоненту. Это не поддерживается. Компоненты, которые вы создали, могут быть добавлены или удалены условно.
Уже создана проблема для angular2
, так что это должно быть так с угловым 4.
В качестве альтернативы вы можете перейти к опции с помощью ng-if
<button ngIf="!condition"></button>
<button ngIf="condition" md-raised-button></button>
Ответ 7
да, возможно.
html-страница с директивой appActiveAhover:)
<li routerLinkActive="active" #link1="routerLinkActive">
<a [appActiveAhover]='link1.isActive?false:true' routerLink="administration" [ngStyle]="{'background':link1.isActive?domaindata.get_color3():none}">
<i class="fa fa-users fa-lg" aria-hidden="true"></i> Administration</a>
</li>
<li routerLinkActive="active" #link2="routerLinkActive">
<a [appActiveAhover]='link2.isActive?false:true' routerLink="verkaufsburo" [ngStyle]="{'background':link2.isActive?domaindata.get_color3():none,'color':link2.isActive?color2:none}">
<i class="fa fa-truck fa-lg" aria-hidden="true"></i> Verkaufsbüro</a>
</li>
<li routerLinkActive="active" #link3="routerLinkActive">
<a [appActiveAhover]='link3.isActive?false:true' routerLink="preisrechner" [ngStyle]="{'background':link3.isActive?domaindata.get_color3():none}">
<i class="fa fa-calculator fa-lg" aria-hidden="true" *ngIf="routerLinkActive"></i> Preisrechner</a>
</li>
директива
@Directive({
selector: '[appActiveAhover]'
})
export class ActiveAhoverDirective implements OnInit {
@Input() appActiveAhover:boolean;
constructor(public el: ElementRef, public renderer: Renderer, public domaindata: DomainnameDataService) {
}
ngOnInit() {
}
@HostListener('mouseover') onMouseOver() {
if(this.appActiveAhover){
this.renderer.setElementStyle(this.el.nativeElement, 'color', this.domaindata.domaindata.color2);
}
}
@HostListener('mouseout') onMouseOut() {
if(this.appActiveAhover){
this.renderer.setElementStyle(this.el.nativeElement, 'color', 'white');
}
}
}
Ответ 8
Я не мог найти хорошее существующее решение, поэтому я создал свою собственную директиву, которая делает это.
import { Directive, ElementRef, Input } from '@angular/core';
@Directive({
selector: '[dynamic-attr]'
})
export class DynamicAttrDirective {
@Input('dynamic-attr') attr: string;
private _el: ElementRef;
constructor(el: ElementRef) {
this._el = el;
}
ngOnInit() {
if (this.attr === '') return null;
const node = document.createAttribute(this.attr);
this._el.nativeElement.setAttributeNode(node);
}
}
Тогда ваш HTML:
<div dynamic-attr="{{hasMargin: 'margin-left'? ''}}"></div>
Ответ 9
Это тоже может быть решение:
[md-raised-button]="condition ? 'true' : ''"
Он работает для angular 4, ионный 3, как это:
[color]="condition ? 'primary' : ''"
где condition
- это функция, которая решает, является ли это активной страницей или нет. Весь код выглядит следующим образом:
<button *ngFor="let page of ..." [color]="isActivePage(page) ? 'primary' : ''">{{ page.title }}</button>
Ответ 10
Используйте NgClass
[ngClass]="{ 'mat-raised-button': trueCondition }"
пример истинного условия:
this.element === 'Today'
или логическая функция
getTruth()
полный пример:
<button [ngClass]="{ 'mat-raised-button': trueCondition }">TEXT</button>
Если вам нужен класс по умолчанию:
<button [ngClass]="{ 'mat-raised-button': trueCondition, 'default-class': !trueCondition }">TEXT</button>
Ответ 11
У меня появилось другое представление о том, что вы можете сделать.
Вы можете сохранить html, который вы хотите заменить в переменной как строку, а затем добавить/удалить директиву из него, как вам угодно, используя метод bypassSecurityTrustHtml
DomSanitizer.
Я не приведу к чистому решению, но, по крайней мере, вам не нужно повторять код.
Ответ 12
По состоянию на 18 января 2019 года я так условно добавил директиву в Angular 5 и выше. Мне нужно было изменить цвет компонента <app-nav>
на основе darkMode
. Если страница была в темном режиме или нет.
Это сработало для меня:
<app-nav [color]="darkMode? 'orange':'green'"></app-nav>
Я надеюсь, что это помогает кому-то.
РЕДАКТИРОВАТЬ
Это изменяет значение атрибута (цвета) в зависимости от условия. Просто бывает, что цвет определяется с помощью директивы. Таким образом, любой, кто читает это, пожалуйста, не смущайтесь, это не применяет директиву условно (то есть означает добавление или удаление директивы к dom на основе условия)