84 votes

Comment afficher des images dans Angular2 ?

J'essaie de placer le chemin d'accès relatif à l'une de mes images dans mon dossier de ressources dans une balise image src de mon application Angular2. J'ai défini la variable "fullImagePath" dans mon composant et l'ai utilisée dans mon modèle. J'ai essayé de nombreux chemins différents, mais je ne parviens pas à afficher mon image. Existe-t-il un chemin spécial dans Angular2 qui est toujours relatif à un dossier statique comme dans Django ?

Composant

import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'app-hero',
  templateUrl: './hero.component.html',
  styleUrls: ['./hero.component.css']
})

export class HeroComponent implements OnInit {
  fullImagePath: string;

  constructor() {
    this.fullImagePath = '../../assets/images/therealdealportfoliohero.jpg'
  }

  ngOnInit() {
  }

}

J'ai également placé l'image dans le même dossier que ce composant. Étant donné que le modèle et les css se trouvent dans le même dossier, je ne vois pas pourquoi un chemin relatif similaire vers l'image ne fonctionne pas. Voici le même composant avec l'image dans le même dossier.

import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'app-hero',
  templateUrl: './hero.component.html',
  styleUrls: ['./hero.component.css']
})

export class HeroComponent implements OnInit {
  fullImagePath: string;

  constructor() {
    this.fullImagePath = './therealdealportfoliohero.jpg'
  }

  ngOnInit() {
  }

}

html

<div class="row">
    <div class="col-xs-12">
        <img [src]="fullImagePath">
    </div>
</div>

arbre des applications * J'ai laissé de côté le dossier des modules de nœuds pour gagner de la place.

├── README.md
├── angular-cli.json
├── e2e
│   ├── app.e2e-spec.ts
│   ├── app.po.ts
│   └── tsconfig.json
├── karma.conf.js
├── package.json
├── protractor.conf.js
├── src
│   ├── app
│   │   ├── app.component.css
│   │   ├── app.component.html
│   │   ├── app.component.spec.ts
│   │   ├── app.component.ts
│   │   ├── app.module.ts
│   │   ├── hero
│   │   │   ├── hero.component.css
│   │   │   ├── hero.component.html
│   │   │   ├── hero.component.spec.ts
│   │   │   ├── hero.component.ts
│   │   │   └── portheropng.png
│   │   ├── index.ts
│   │   └── shared
│   │       └── index.ts
│   ├── assets
│   │   └── images
│   │       └── therealdealportfoliohero.jpg
│   ├── environments
│   │   ├── environment.dev.ts
│   │   ├── environment.prod.ts
│   │   └── environment.ts
│   ├── favicon.ico
│   ├── index.html
│   ├── main.ts
│   ├── polyfills.ts
│   ├── styles.css
│   ├── test.ts
│   ├── tsconfig.json
│   └── typings.d.ts
└── tslint.json

4 votes

Pourquoi voulez-vous utiliser un chemin relatif ? Ne pouvons-nous pas le configurer pour qu'il commence à partir de Root (c'est-à-dire this.fullImagePath = '/assets/images/therealdealportfoliohero.jpg' )

1 votes

Malheureusement, ça n'a pas marché. Comment l'application sait-elle où se trouve la racine ? Est-ce la racine du projet, ou est-ce toujours un actif pour les fichiers statiques comme les css, les images et le javascript ?

0 votes

Oui, ça dépend vraiment de votre installation. Pour moi, je sépare les actifs de la partie code (en ayant des tâches gulp différentes pour eux) afin de savoir exactement où sont les actifs.

118voto

Babar Bilal Points 2086

Angular ne fait que pointer vers src/assets rien d'autre n'est public pour accéder via url donc vous devez utiliser le chemin complet

 this.fullImagePath = '/assets/images/therealdealportfoliohero.jpg'

Ou

 this.fullImagePath = 'assets/images/therealdealportfoliohero.jpg'

Cela ne fonctionnera que si la balise href de base est définie par l'option /

Note dans l'édition : La commande Dist essaiera de trouver toutes les pièces jointes à partir des actifs, il est donc également important de garder les images et tous les fichiers auxquels vous voulez accéder via url à l'intérieur des actifs, comme les fichiers de données mock json doivent également être dans les actifs.

1 votes

Merci pour votre réponse, elle m'a beaucoup aidé. J'apprécierais si vous pouviez me dire où dans la documentation officielle cela est documenté ?

0 votes

Les projets Angular réalisés à l'aide d'angular-cli suivent l'endroit où les ressources peuvent être servies à partir de l'onglet .angular-cli.json fichier. Voir la réponse de @michal-ambrož pour plus d'informations.

1 votes

Merci ! ...quand vous jouez avec Angular depuis des mois et que vous réalisez soudain que vous n'avez pas encore eu à ajouter une seule image ;-)

11voto

Michal Ambrož Points 129

Si vous n'aimez pas le dossier des actifs, vous pouvez modifier .angular-cli.json et ajoutez les autres dossiers dont vous avez besoin.

  "assets": [
    "assets",
    "img",
    "favicon.ico"
  ]

3 votes

Pourquoi si j'ajoute "assets": [ "assets", "assets/images", "favicon.ico" ], ça ne marche toujours pas ?

4voto

Gajanan Kulkarni Points 281

Ajoutez le chemin de votre image comme fullPathname='assets/images/therealdealportfoliohero.jpg' dans votre constructeur. Cela fonctionnera certainement.

2voto

davaus Points 71

J'utilise le projet de modèle angulaire Asp.Net Core avec un front-end Angular 4 et webpack. J'ai dû utiliser '/dist/assets/images/' devant le nom de l'image, et stocker l'image dans le répertoire assets/images du répertoire dist. eg :

 <img  class="img-responsive" src="/dist/assets/images/UnitBadge.jpg">

0 votes

Mais lorsque vous êtes en phase de développement, cela ne fonctionnerait pas, n'est-ce pas ?

2 votes

@davaus probablement parce que vous avez déjà fait une construction et que votre ancienne 'dist' est juste là. Si vous mettez à jour une image, elle ne sera pas rafraîchie avant d'être construite.

0 votes

C'est logique. Merci.

1voto

Abhishek G Points 19

Il suffit de placer vos images dans le dossier assets et de les référencer dans votre html pages ou ts avec ce lien.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X