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

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.


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"
  ]

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.


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">

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.


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ć.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.