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.