6
votes

Remplacer l'icône du tapis par un graphique SVG

Débutant angulaire ici .. quelqu'un pourrait-il me diriger vers la bonne voie, comment pourrais-je remplacer correctement les icônes de matériau existantes par des icônes personnalisées, plus précisément avec les graphismes SVG? Quelque chose comme ceci:

Donc ceci:

<mat-icon class="mat-icon-rtl-mirror">
     {{nestedTreeControl.isExpanded(node) ? 'INSERT_SVG_1_HERE' : 'INSERT_SVG_2_HERE'}}
</mat-icon>

Avec ceci:

<mat-icon class="mat-icon-rtl-mirror">
     {{nestedTreeControl.isExpanded(node) ? 'expand_more' : 'chevron_right'}}
</mat-icon>


0 commentaires

3 Réponses :


-1
votes

Si cela ne fait pas partie des icônes matérielles, pourquoi ne pas l'utiliser comme une image normale. Utilisez-le simplement comme une balise d'image normale:

<img src="{{nestedTreeControl.isExpanded(node) ? 'path_to_svg_file_1.svg' : 'path_to_svg_file_2'}}">


1 commentaires

Cela ne semble pas fonctionner comme ça… affiche seulement '../folder' si je l'insère comme '../assets/SVG_file.svg'



9
votes

Cela ne résout pas exactement votre problème, car vous devrez utiliser l'argument svgIcon sur l'élément mat-icon au lieu d'utiliser le innerText de mat-icon mais sinon ça marche:

  1. Vous devez autoriser angular à importer à partir de svg en déclarant le module.
  2. Pour importer / insérer les icônes dans javascript, vous devrez remplacer le chargeur. Ceci peut être réalisé en utilisant le raw-loader .
  3. Vous pourrez maintenant importer le svg dans angular et les enregistrer via MatIconRegistry ;

À titre d'exemple:

//src/app/app.component.html
...
<mat-icon [svgIcon]="expanded ? 'chevron_right' : 'expand_more'" (click)="expanded = !expanded"></mat-icon>
...
// src/app/app.module.ts
...
import expandMore from '!!raw-loader!@mdi/svg/svg/chevron-down.svg';
import chevronRight from '!!raw-loader!@mdi/svg/svg/chevron-right.svg';
...
export class WeddingDayModule {
  constructor(
    private iconRegistry: MatIconRegistry,
    private sanitizer: DomSanitizer
  ) {
    iconRegistry
      .addSvgIconLiteral('chevron_right', sanitizer.bypassSecurityTrustHtml(chevronRight))
      .addSvgIconLiteral('expand_more', sanitizer.bypassSecurityTrustHtml(expandMore));
  }
 }

// src/app/thumbs-up.svg
<svg>...</svg>
// src/app/app.component.html
<mat-icon svgIcon="thumbsUp"></mat-icon>

Une autre approche consisterait à installer @mdi/svg

npm install @ mdi / svg

puis suivez les étapes ci-dessus, à la différence d'importer également chaque icône nécessaire, par exemple expand_more et chevron_right

donc dans src/app/app.module.ts

// src/app/app.module.ts
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { DomSanitizer } from '@angular/platform-browser';
import { FormsModule } from '@angular/forms';
import { MatIconModule, MatIconRegistry } from '@angular/material';

import { AppComponent } from './app.component';
import { HelloComponent } from './hello.component';

import thumbsUp from '!!raw-loader!./thumbs-up.svg';

@NgModule({
  imports:      [ 
    BrowserModule, 
    FormsModule, 
    MatIconModule 
  ],
  declarations: [ AppComponent, HelloComponent ],
  bootstrap:    [ AppComponent ]
})
export class AppModule {
  constructor(iconRegistry: MatIconRegistry, sanitizer: DomSanitizer) {
    iconRegistry.addSvgIconLiteral(
        'thumbsUp', sanitizer.bypassSecurityTrustHtml(thumbsUp));
  }
}

Et dans le html juste pour simplifier ... mais vous aurez l'idée ...

// src/typings.d.ts

declare module '*.svg' {
  const svg: string;
  export default svg;
}

l'inconvénient de cette approche est, que vous devrez enregistrer toutes les icônes que vous souhaitez utiliser ... Mais au moins vous restez dans le même domaine de changement. Au lieu d'utiliser les ligatures, vous pouvez toutes les changer via svgIcon et vous obtenez plus d'icônes que les icônes que la bibliothèque obsolète material-design-icons contient.

J'espère que cela aide


6 commentaires

Oui, je suis conscient de cette approche et j'ai réussi à l'utiliser comme svgIcon sur mat-icon… Cependant, j'essaie de trouver un moyen de remplacer 'expand_more': 'chevron_right' par des SVG personnalisés, donc ça pourrait être utilisé dans les conditionnels etc… Je ne sais pas si c'est possible du tout? Merci pour l'effort, le récompensera lorsqu'il sera activé


Donc, si je comprends bien, l'implémentation que vous souhaitez réaliser est de trouver un moyen cohérent d'utiliser une icône svg personnalisée ou une icône de matériau defaultish ?


oui correct - donc si j'ai un graphisme SVG personnalisé, disons US-flag, je voudrais pouvoir l'utiliser comme 'us_flag_custom' à tout moment


D'accord, alors que diriez-vous de le retourner dans l'autre sens et d'utiliser par exemple @ mdi / svg , puis importez les icônes de matériau comme mentionné ci-dessus. Ensuite, ils peuvent au moins être utilisés de manière cohérente comme svgIcon. Pas parfait car vous auriez à enregistrer chaque icône de matériau que vous souhaitez utiliser ... Si vous pensez que cela résoudrait le problème, je mettrai à jour la réponse


Oui, s'il vous plaît, cette approche serait également intéressante à voir


@Smithy btw, juste figuré, vous pouvez le mélanger sans problème. {{icon}} , si aucune ligature n'est disponible, le svgIcon est pris.



0
votes

Vous pouvez utiliser angular-svg-icon

L'icône angular-svg est un service et un composant Angular 7 qui fournit un moyen d'insérer des fichiers SVG pour leur permettre d'être facilement stylisé par CSS et code.

Le service fournit un registre d'icônes qui charge et met en cache un SVG indexé par son URL. Le composant est responsable de l'affichage du SVG. Après avoir obtenu le svg du registre, il clone le SVGElement et le SVG au HTML interne du composant.

Pour plus d'informations: https://www.npmjs.com/package/angular -svg-icon


0 commentaires