Wie kann ich Bilder in Angular2 bereitstellen?

80

Ich versuche, den relativen Pfad zu einem meiner Bilder in meinem Assets-Ordner in einem Bild-src-Tag in meiner Angular2-App zu platzieren. Ich habe eine Variable in meiner Komponente auf 'fullImagePath' gesetzt und diese in meiner Vorlage verwendet. Ich habe viele verschiedene mögliche Wege ausprobiert, kann aber mein Image nicht verbessern. Gibt es in Angular2 einen speziellen Pfad, der immer relativ zu einem statischen Ordner wie in Django ist?

Komponente

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() {
  }

}

Ich habe das Bild auch in denselben Ordner wie diese Komponente gelegt. Da die Vorlage und das CSS im selben Ordner funktionieren, bin ich mir nicht sicher, warum ein ähnlicher relativer Pfad zum Bild nicht funktioniert. Dies ist dieselbe Komponente mit dem Bild im selben Ordner.

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>

App-Baum * Ich habe den Ordner mit den Knotenmodulen aus Platzgründen weggelassen

├── 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
TJB
quelle
4
Warum möchten Sie einen relativen Pfad verwenden? Können wir es nicht so einstellen, dass es von root (dh this.fullImagePath = '/assets/images/therealdealportfoliohero.jpg') beginnt
Harry Ninh
1
Das hat leider nicht funktioniert. Woher weiß die Anwendung, wo sich die Wurzel befindet? Ist es das Projektstammverzeichnis oder sind es immer Assets für statische Dateien wie CSS, Bilder und Javascript?
TJB
Ja, es hängt wirklich von Ihrem Setup ab. Für mich trenne ich Assets vom Codeteil (indem ich verschiedene Gulp-Aufgaben für sie habe), damit ich genau weiß, wo sich die Assets befinden.
Harry Ninh
Phwew, hat es endlich geschafft, Harry zu arbeiten. Sie hatten Recht, den vollständigen Pfad zu verwenden. Der Grund, warum es nicht funktionierte, war ein Problem, das ich in der Vergangenheit hatte, als ich Photoshop verwendete und Bilder von dort nicht richtig exportierte. Argghhh Photoshoppppp! Trotzdem Danke Harry!
TJB

Antworten:

109

Angular zeigt nur auf den src/assetsOrdner, nichts anderes ist öffentlich, um über die URL darauf zuzugreifen. Sie sollten also den vollständigen Pfad verwenden

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

Oder

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

Dies funktioniert nur, wenn das Basis-href-Tag mit festgelegt ist /

Sie können auch andere Ordner für Daten hinzufügen angular/cli. Sie müssen lediglich Änderungen vornehmenangular-cli.json

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

Hinweis beim Bearbeiten: Der Befehl Dist versucht, alle Anhänge von Assets zu finden. Daher ist es auch wichtig, die Bilder und alle Dateien, auf die Sie über die URL zugreifen möchten, in Assets zu behalten, z. B. sollten sich Schein-JSON-Datendateien auch in Assets befinden sollten.

Umar Younis
quelle
1
Vielen Dank für Ihre Antwort, es hat mir sehr geholfen. Ich würde mich freuen, wenn Sie mir sagen könnten, wo in den offiziellen Dokumenten dies dokumentiert ist.
Ziv Glazer
Mit Angular-Cli-Track erstellte Winkelprojekte, bei denen Assets in der .angular-cli.jsonDatei bereitgestellt werden können . Weitere Informationen finden Sie unter @ michal-ambrož Antwort.
kevin.groat
1
Danke! ... wenn du seit Monaten mit Angular
herumspielst
"Dies funktioniert nur, wenn das Basis-href-Tag mit / festgelegt ist." Was muss ich tun, wenn mein Basis-href auf einen anderen Pfad eingerichtet werden muss, da meine App in einem Unterverzeichnis auf dem Server ausgeführt wird?
Gilles
Es wird den Assets-Ordner in diesem Verzeichnis finden, so dass es meiner Meinung nach kein Problem geben wird
Umar Younis
11

Wenn Sie den Assets-Ordner nicht mögen, können .angular-cli.jsonSie andere benötigte Ordner bearbeiten und hinzufügen.

  "assets": [
    "assets",
    "img",
    "favicon.ico"
  ]
Michal Ambrož
quelle
3
Warum "assets": [ "assets", "assets/images", "favicon.ico" ],funktioniert es immer noch nicht, wenn ich es hinzufüge ?
Bielas
4

Fügen Sie Ihren Bildpfad wie fullPathname='assets/images/therealdealportfoliohero.jpg'in Ihrem Konstruktor hinzu. Es wird definitiv funktionieren.

Gajanan Kulkarni
quelle
3

Ich verwende das Winkelvorlagenprojekt Asp.Net Core mit einem Angular 4-Frontend und einem Webpack. Ich musste '/ dist / Assets / Images /' vor dem Bildnamen verwenden und das Bild im Verzeichnis Assets / Images im Verzeichnis dist speichern. z.B:

 <img  class="img-responsive" src="/dist/assets/images/UnitBadge.jpg">
Davaus
quelle
Aber wenn Sie in der Entwicklung sind, würde das nicht richtig funktionieren?
devN
2
@davaus wahrscheinlich, weil du bereits einen Build gemacht hast, also sitzt dein alter 'dist' nur da. Wenn Sie ein Image aktualisieren, wird es erst beim Erstellen aktualisiert.
Simon_Weaver
Das macht Sinn. Vielen Dank.
Davaus
1

Legen Sie Ihre Bilder einfach in den Assets-Ordner und verweisen Sie sie auf Ihre htmlSeiten oder tsDateien mit diesem Link.

Abhishek G.
quelle
1

Im Winkel wird nur eine Seite vom Server angefordert, nämlich index.html. Index.html und Assets-Ordner befinden sich im selben Verzeichnis. Geben Sie beim Einfügen eines Bilds in eine beliebige Komponente einen src-Wert wie an assets\image.png. Dies funktioniert einwandfrei, da der Browser eine Anfrage an den Server für dieses Bild stellt und das Webpack dieses Bild bereitstellen kann.

R. Sarkar
quelle