Estoy usando Material 2 para agregar md-raised-button
. Quiero aplicar esta directiva solo si cierta condición se cumple.
Por ejemplo:
<button md-raised-button="true"></button>
Otro ejemplo: creé una forma reactiva dinámica básica en plunker. Estoy usando una formArrayName
directiva de forma reactiva para una matriz de controles. Quiero aplicar la formArrayName
directiva solo si una condición específica se cumple; de lo contrario, no agregue la formArrayName
directiva.
Aquí hay un enlace de plunker .
angular
angular-material
angular2-forms
angular2-directives
angular-material2
usuario2899728
fuente
fuente
Respuestas:
No sé si puede aplicar directivas basadas en una condición, pero una solución alternativa sería tener 2 botones y mostrarlos en función de una condición .
Editar: tal vez esto sea útil.
fuente
Si solo necesita agregar un atributo para activar las reglas CSS, puede usar el siguiente método: (esto no crea / destruye dinámicamente una directiva)
<button [attr.md-raised-button]="condition ? '' : null"></button>
Aplica lo mismo a tu plunker: tenedor
Actualizar:
Cómo
condition ? '' : null
funciona como valor:Cuando es la cadena vacía (
''
) se convierteattr.md-raised-button=""
, cuando esnull
el atributo no existirá.Actualización: plunker update: fork (problemas de versión solucionados, tenga en cuenta que la pregunta se basó originalmente en angular 4)
fuente
Como ya se señaló, esto no parece ser posible. Una cosa que se puede utilizar para al menos prevenir algunas duplicaciones es
ng-template
. Esto le permite extraer el contenido del elemento afectado por langIf
ramificación.Si, por ejemplo, desea crear un componente de menú jerárquico utilizando Material angular:
Aquí es la directiva aplicada condicionalmente
matMenuTriggerFor
, que solo debe aplicarse a elementos de menú con niños. El contenido del botón se inserta en ambos lugares a través dengTemplateOutlet
.fuente
Esto puede llegar tarde, pero es un método viable y elegante para aplicar una directiva de forma condicional.
En la clase directiva, cree la variable de entrada:
Al aplicar la directiva, establezca la propiedad de aplicación de la variable de entrada:
En el método de la directiva, verifique la variable this.options.apply y aplique la lógica de la directiva basada en la condición:
fuente
Como también han dicho otros,
directives
no se puede aplicar dinámicamente.Sin embargo, si solo desea cambiar
md-button
el estilo de plano a elevado , esteharía el truco. Plunker
fuente
Esta también podría ser una solución:
[md-raised-button]="condition ? 'true' : ''"
Funciona para angular 4, ionic 3 como este:
[color]="condition ? 'primary' : ''"
dondecondition
es una función que decide si esta es una página activa o no. Todo el código se ve así:<button *ngFor="let page of ..." [color]="isActivePage(page) ? 'primary' : ''">{{ page.title }}</button>
fuente
Actualmente, existe una
NO
forma de aplicar condicionalmente una directiva a un componente. Esto no es compatible. Los componentes que ha creado se pueden agregar o eliminar condicionalmente.Ya existe un problema creado para lo mismo con
angular2
, por lo que también debería ser el caso con angular4.Alternativamente, puede optar por la opción con ng-if
fuente
No pude encontrar una buena solución existente, así que construí mi propia directiva que hace esto.
Entonces tu html:
<div dynamic-attr="{{hasMargin: 'margin-left' ? ''}}"></div>
fuente
@HostBinding('attr.dynamic-attr') @Input('dynamic-attr') attr: string;
lugar de ngOnInit + ElementRef.Quizás ayude a alguien.
En el siguiente ejemplo, tengo el
my-button.component.html
y quiero aplicar la*appHasPermission
directiva al<button>
solo si elrole
atributo está establecido.De esa forma no duplicarás el
<button>
código.fuente
Sí, es posible.
página html con la directiva appActiveAhover :)
directiva
fuente
¡Pasar
null
a la directiva lo elimina!fuente
Utilizar
NgClass
ejemplo de condición verdadera:
o una función booleana
ejemplo completo:
Si quieres una clase predeterminada:
fuente
md-raised-button
atributo como falso)Tengo otra idea de lo que podrías hacer.
Puede almacenar el html que desea reemplazar en una variable como una cadena y luego agregar / eliminar la directiva como desee, utilizando el
bypassSecurityTrustHtml
método de DomSanitizer .No obtengo una solución limpia, pero al menos no es necesario que repita el código.
fuente
Al 18 de enero de 2019, así es como agregué una directiva condicionalmente en Angular 5 y superior. Necesitaba cambiar el color del
<app-nav>
componente en función dedarkMode
. Si la página estaba en modo oscuro o no.Esto funcionó para mí:
<app-nav [color]="darkMode ? 'orange':'green'"></app-nav>
Espero que esto ayude a alguien.
EDITAR
Esto cambia el valor de un atributo (color) según una condición. Sucede que el color se define mediante una directiva. Entonces, cualquiera que lea esto, no se confunda, esto no está aplicando una directiva condicionalmente (es decir, lo que significa agregar o eliminar una directiva al dom en función de una condición)
fuente