Appliquer une directive sous condition

j'utilise le matériau 2 pour ajouter md-raised-button .

Je ne veux appliquer cette directive que si certaines conditions deviennent vraies.

par exemple:

<button md-raised-button="true"></button>

autre exemple: J'ai créé une forme de réaction dynamique de base dans plunker. J'utilise la directive formArrayName de la forme réactive pour l'ensemble des commandes. Je ne veux appliquer la directive formArrayName que si une condition spécifique devient vraie. sinon, n'ajoutez pas formArrayName directive. J'ai fait beaucoup de recherches, mais j'ai pu trouver une solution.

voici plunker link: https://plnkr.co/edit/oPZ7PyBSf8jjYa2KVh4J?p=preview

j'apprécierais vraiment toute contribution.

Merci d'avance!

29
demandé sur Alexander Abakumov 2017-06-16 22:58:46

11 réponses

Je ne sais pas si vous pouvez appliquer des directives basées sur une condition, mais un contournant aurait 2 boutons et les afficher basée sur une condition .

<button *ngIf="!condition"></button>
<button *ngIf="condition" md-raised-button></button> 

Edit: peut-être ce sera utile.

20
répondu LLL 2017-11-30 14:48:43

vous pouvez utiliser la méthode suivante:

<button [attr.md-raised-button]="condition ? '' : null"></button>

appliqué la même chose à votre plongeur: fourche

mise à jour:

Comment condition ? '' : null fonctionne comme la valeur:

quand sa chaîne vide ( '' ) devient attr.md-raised-button="" , quand son null l'attribut n'existera pas.

23
répondu Aldracor 2018-05-09 14:46:11

comme d'autres l'ont également déclaré, directives ne peut pas être appliqué dynamiquement.

cependant, si vous voulez juste basculer md-button 's style de plat à surélevé , puis ce

<button md-button [class.mat-raised-button]="isRaised">Toggle Raised Button</button>

ferait l'affaire. Plunker

5
répondu Ankit Singh 2017-06-21 04:32:53

comme nous l'avons déjà noté, cela ne semble pas possible. Une chose qui peut être utilisée pour au moins empêcher une certaine duplication est ng-template . Cela permet d'extraire le contenu de l'élément affecté par la ramification ngIf .

si vous voulez par exemple créer un composant de menu hiérarchique en utilisant un matériau angulaire:

<!-- 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>

ici, la directive appliquée conditionnellement est matMenuTriggerFor , qui ne doit être appliquée qu'au menu les articles avec les enfants. Le contenu du bouton est inséré aux deux endroits via ngTemplateOutlet .

5
répondu H.B. 2018-01-04 02:31:24

cela peut être tardif, mais c'est une méthode viable et élégante pour appliquer une directive conditionnellement.

dans la classe directive créer la variable d'entrée:

@Input('myDirective') options: any;

lors de l'application de la directive, définissez la propriété apply de la variable d'entrée:

<div [myDirective] = {apply: someCondition}></div>

dans la méthode de la directive vérifier pour la variable ceci.option.appliquer et appliquer la logique de la directive basée sur la condition:

ngAfterViewInit(): void {
    if (!this.options.apply) {
        return;
    }

    // directive logic
}
4
répondu Tiha 2018-01-29 08:38:03

Actuellement, il y a NO façon d'appliquer conditionnellement une directive à un composant.Ce n'est pas pris en charge.Les composants que vous avez créés peuvent être ajoutés ou supprimés sous condition.

il y a déjà une question créée pour les mêmes avec angular2 , ce devrait donc être le cas avec angular4 aswell.

vous pouvez aussi choisir l'option avec ng-si

<button ngIf="!condition"></button>
<button ngIf="condition" md-raised-button></button> 
3
répondu Sajeetharan 2017-06-19 18:16:29

Oui c'est possible.

page html avec la directive 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

@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');
    }
  }

}
2
répondu Chaitanya Nekkalapudi 2017-11-22 09:20:31

Ce pourrait être aussi une solution:

[md-raised-button]="condition ? 'true' : ''"


ça marche pour angular 4, ionic 3 comme ça:

[color]="condition ? 'primary' : ''"condition est une fonction qui décide s'il s'agit d'une page active ou non. Le code entier ressemble à ceci:

<button *ngFor="let page of ..." [color]="isActivePage(page) ? 'primary' : ''">{{ page.title }}</button>

1
répondu zalog 2017-09-11 10:35:56

Je n'ai pas pu trouver une bonne solution existante, donc j'ai construit ma propre directive qui fait cela.

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);
  }
}

puis votre html:

<div dynamic-attr="{{hasMargin: 'margin-left' ? ''}}"></div>

1
répondu Cappi10 2018-02-19 14:10:38

Utiliser NgClass

[ngClass]="{ 'mat-raised-button': trueCondition }"

exemple de condition vraie:

this.element === 'Today'

ou une fonction booléenne

getTruth()

exemple complet:

  <button [ngClass]="{ 'mat-raised-button': trueCondition }">TEXT</button>

si vous voulez une classe par défaut:

  <button [ngClass]="{ 'mat-raised-button': trueCondition, 'default-class': !trueCondition }">TEXT</button>
0
répondu Moshe 2017-06-16 20:04:05

j'ai une autre idée de ce que vous pourriez faire.

vous pouvez stocker le html que vous voulez remplacer dans une variable comme une chaîne de caractères et ensuite ajouter / supprimer la directive de celui-ci comme vous le souhaitez, en utilisant la méthode bypassSecurityTrustHtml de la DomSanitizer .

Je n'ai pas de solution propre mais au moins vous n'avez pas besoin de répéter le code.

0
répondu LLL 2017-06-20 17:06:33