Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use Angular structural directive with multiple inputs

I want to implement something similar with angular-permisssion. And with requirement to control the element's existance, I need to use angular structural directive.

At the beginning, i think such syntax would work:

<h2 *permissionIf [permissionIfExcept]="'Read'">Except</h2> 

However, it doesn't work that way.

Moreover, the offical guide only teach you how to write custom structural directive with single input. With multi-inputs, some third-party tutorials involve a bit. But that's using the angular template micro-syntax to achieve data binding. Then one problem occurs: template syntax doesn't support pure key-value inputs:

<h2 *permissionIf="except: map.except;only: 'test'">Except</h2> 

It expands into this(which is illegal):

<h2 template="permissionIf except: map.except;only: 'test'">Except</h2> 

A stupid temporary solution is add a useless variable declaration.

<h2 *permissionIf="let i;except: map.except;only: 'test'">Except</h2> 

Another inconvenient way is to use template element to wrap the code.

<template permissionIf [permissionIfExcept]="'Read'">   <h2>Except</h2> </template> 

The above all are not accepetable enough. But I can't find a bette way to resolve it.

Hope some guys can give some suggestion:).

like image 782
e-cloud Avatar asked Jan 22 '17 10:01

e-cloud


People also ask

Can we use multiple directives in Angular?

You can not use two structural directives on the same element. You need to wrap your element in another one. It's advised to use ng-container since it wont be rendered in DOM.

Can we use two structural directive in a single HTML element?

Comparing Component and Structural Directives A component directive can be created multiple times, that is, every component in Angular will have a @Component decorator attached, while we cannot apply more than one structural directive to the same HTML element.

How many structural directives can you place on an element?

You may apply only one structural directive to an element.

Can a component have multiple selectors?

With , separated multiple selectors can be used where the component is added to elements where one of these matches. Many of Angulars built-in directives use a list of selectors.


1 Answers

The input names need all to be prefixed with the selector of the directive, followed by the input name capitalized (i.e. permissionIfExcept). Example:

  @Directive({     selector: '[permissionIf]'   })   export class PermissionIfDirective implements AfterContentInit {      private _permissionIf:string[];     @Input()      set permissionIf(value: string[]) {       this._permissionIf=value;       console.log('permissionIf: ', value);     }      private _except:string;     @Input()      set permissionIfExcept(value: string) {       this._except = value;       console.log('except: ', value);     }   } 

To use them with the '*' syntax:

<div *permissionIf="permissions;except:'Read'"></div> 

Note here you're using the name following the prefix uncapitalized (i.e. except). Also note the : in the assignment.

The explicit syntax (using template) would look like this:

<template [permissionIf]="permissions" [permissionIfExcept]="'Read'">   </div></div> </template> 

but with <ng-container> it could look like

<ng-container *permissionIf="permissions;except:'Read'">   <div></div> </ng-container> 

Plunker example

See also the source of NgFor as an example.

like image 85
Günter Zöchbauer Avatar answered Oct 01 '22 06:10

Günter Zöchbauer