Jak wyświetlać obrazy w Angular2?

80

Próbuję umieścić względną ścieżkę do jednego z moich obrazów w folderze zasobów w tagu src obrazu w mojej aplikacji Angular2. Ustawiłem zmienną w moim komponencie na „fullImagePath” i użyłem tego w moim szablonie. Próbowałem wielu różnych możliwych ścieżek, ale po prostu nie mogę poprawić swojego wizerunku. Czy w Angular2 jest jakaś specjalna ścieżka, która jest zawsze względna do folderu statycznego, takiego jak w Django?

Składnik

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

}

Umieściłem również obraz w tym samym folderze co ten komponent, więc ponieważ szablon i css w tym samym folderze działają, nie jestem pewien, dlaczego podobna ścieżka względna do obrazu nie działa. To jest ten sam komponent z obrazem w tym samym folderze.

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>

drzewo aplikacji * Pominąłem folder modułów węzłów, aby zaoszczędzić miejsce

├── 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
źródło
4
Dlaczego chcesz użyć ścieżki względnej? Nie możemy ustawić startu od roota (tj. this.fullImagePath = '/assets/images/therealdealportfoliohero.jpg')
Harry Ninh
1
Niestety to nie zadziałało. Skąd aplikacja wie, gdzie jest root? Czy jest to katalog główny projektu, czy też zawsze są to zasoby dla plików statycznych, takich jak css, obrazy i javascript?
TJB
Tak, to naprawdę zależy od twojej konfiguracji. Dla mnie oddzielam zasoby od części kodu (wykonując dla nich różne zadania), więc będę wiedział dokładnie, gdzie są zasoby.
Harry Ninh,
Phwew, wreszcie zaczął działać, Harry. Miałeś rację, używając pełnej ścieżki. Powodem, dla którego to nie działało, był problem, który miałem w przeszłości podczas korzystania z Photoshopa i niepoprawne eksportowanie obrazów z tego miejsca. Argghhh Photoshoppppp! W każdym razie dzięki, Harry!
TJB

Odpowiedzi:

110

Angular wskazuje tylko na src/assetsfolder, nic innego nie jest dostępne publicznie za pośrednictwem adresu URL, więc powinieneś użyć pełnej ścieżki

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

Lub

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

Działa to tylko wtedy, gdy znacznik base href jest ustawiony na /

Możesz także dodać inne foldery na dane w angular/cli. Wszystko, co musisz zmodyfikować, toangular-cli.json

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

Uwaga przy edycji: polecenie Dist spróbuje znaleźć wszystkie załączniki z zasobów, więc ważne jest również, aby zachować obrazy i wszelkie pliki, do których chcesz uzyskać dostęp za pośrednictwem adresu URL, w zasobach, takie jak pozorowane pliki danych json również powinny znajdować się w zasobach.

Umar Younis
źródło
1
Dziękuję za odpowiedź, bardzo mi to pomogło. Byłbym wdzięczny, gdybyś mógł mi powiedzieć, gdzie w oficjalnych dokumentach jest to udokumentowane?
Ziv Glazer
Projekty kątowe utworzone za pomocą angular-cli śledzą, z których zasoby mogą być obsługiwane w .angular-cli.jsonpliku. Aby uzyskać więcej informacji, zobacz odpowiedź @ michal-ambrož.
kevin.groat
1
Dzięki! ... kiedy
bawisz się z Angularem
„To zadziała tylko wtedy, gdy tag base href jest ustawiony na /” Co muszę zrobić, jeśli mój podstawowy element href musi zostać ustawiony na inną ścieżkę, ponieważ moja aplikacja będzie działać w podkatalogu na serwerze?
Gilles
Znajdzie folder zasobów w tym katalogu, więc myślę, że nie będzie problemu
Umar Younis
11

Jeśli nie lubisz folderu zasobów, możesz edytować .angular-cli.jsoni dodawać inne potrzebne foldery.

  "assets": [
    "assets",
    "img",
    "favicon.ico"
  ]
Michal Ambrož
źródło
3
Dlaczego, jeśli dodam "assets": [ "assets", "assets/images", "favicon.ico" ],, nadal nie działa?
bielas
4

Dodaj ścieżkę obrazu, jak fullPathname='assets/images/therealdealportfoliohero.jpg'w konstruktorze. Na pewno zadziała.

Gajanan Kulkarni
źródło
3

Używam projektu szablonu kątowego Asp.Net Core z interfejsem i pakietem internetowym Angular 4. Musiałem użyć „/ dist / asset / images /” przed nazwą obrazu i zapisać obraz w katalogu asset / images w katalogu dist. na przykład:

 <img  class="img-responsive" src="/dist/assets/images/UnitBadge.jpg">
davaus
źródło
Ale kiedy jesteś w fazie rozwoju, to nie zadziała, prawda?
devN
2
@davaus prawdopodobnie dlatego, że już utworzyłeś kompilację, więc twój stary 'dist' po prostu tam siedzi. Jeśli zaktualizujesz obraz, nie zostanie on odświeżony, dopóki nie utworzysz.
Simon_Weaver
To ma sens. Dzięki.
davaus
1

Po prostu umieść swoje obrazy w folderze zasobów i skieruj je na swoje htmlstrony lub tspliki z tym linkiem.

Abhishek G.
źródło
1

W angular tylko jedna strona jest żądana z serwera, to jest index.html. Indeks.html i folder zasobów znajdują się w tym samym katalogu. umieszczając obraz w dowolnym komponencie, podaj wartość src, taką jak assets\image.png. To zadziała dobrze, ponieważ przeglądarka wyśle ​​żądanie do serwera dla tego obrazu, a pakiet sieciowy będzie mógł go obsłużyć.

R. Sarkar
źródło