Як обслуговувати зображення в Angular2?


80

Я намагаюся встановити відносний шлях до одного зі своїх зображень у моїй папці активів у тегу src зображення в моєму додатку Angular2. Я встановив змінну в моєму компоненті на 'fullImagePath' і використав це у своєму шаблоні. Я пробував безліч різних можливих шляхів, але, здається, не можу покращити свій образ. Чи існує якийсь спеціальний шлях у Angular2, який завжди є відносно статичної папки, як у Django?

Компонент

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

}

Я також помістив зображення в ту ж папку, що і цей компонент, тому, оскільки шаблон і css в тій самій папці працюють, я не впевнений, чому подібний відносний шлях до зображення не працює. Це той самий компонент із зображенням в тій же папці.

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>

дерево додатків * Я залишив папку вузлів модулів, щоб заощадити місце

├── 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
Чому ви хочете використовувати відносний шлях? Чи не можемо ми встановити, щоб він починався з кореня (тобто this.fullImagePath = '/assets/images/therealdealportfoliohero.jpg')
Гаррі Нін,

1
На жаль, це не спрацювало. Як програма знає, де знаходиться корінь? Це корінь проекту, або це завжди активи для статичних файлів, таких як CSS, зображення та JavaScript?
TJB

Так, це насправді залежить від ваших налаштувань. Для мене я відокремлюю активи від кодової частини (маючи для них різні залпові завдання), щоб я точно знав, де знаходяться активи.
Harry Ninh

Фью, нарешті змусив Гаррі працювати. Ви мали рацію щодо використання повного шляху. Причиною того, що це не спрацьовувало, була проблема, яка раніше виникала при використанні фотошопу та неправильному експортуванні зображень звідти. Argghhh Photoshoppppp! У будь-якому разі Дякую Гаррі!
TJB

Відповіді:


110

Angular вказує лише на src/assetsпапку, ніщо інше не є загальнодоступним для доступу через url, тому слід використовувати повний шлях

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

Або

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

Це буде працювати, лише якщо для базового тегу href встановлено /

Ви також можете додати інші папки для даних у angular/cli. Все, що вам потрібно змінити, цеangular-cli.json

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

Примітка в редагуванні: Команда Dist спробує знайти всі вкладення з активів, тому також важливо зберігати зображення та будь-які файли, до яких ви хочете отримати доступ за допомогою URL-адреси, всередині активів, наприклад, файли даних mock json також повинні бути в активах.


1
Дякую за вашу відповідь, це мені дуже допомогло. Я був би вдячний, якщо б Ви могли сказати мені, де в офіційних документах це задокументовано?
Ziv Glazer

Кутові проекти, виконані за допомогою доріжки angular-cli, звідки у .angular-cli.jsonфайлі можна обслуговувати активи . Для отримання додаткової інформації див. Відповідь @ michal-ambrož.
kevin.groat

1
Дякую! ... коли ти місяцями
граєшся

"Це буде працювати лише в тому випадку, якщо для базового тегу href встановлено / / Що мені потрібно робити, якщо мій базовий href потрібно налаштувати на інший шлях, оскільки моя програма буде працювати в підкаталозі на сервері?
Gilles

Він знайде папку активів у цьому каталозі, тому, думаю, не буде жодної проблеми
Умар Юніс

11

Якщо вам не подобається папка "активи", ви можете редагувати .angular-cli.jsonта додавати інші потрібні папки.

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

3
Чому, якщо я додаю, "assets": [ "assets", "assets/images", "favicon.ico" ],це все одно не працює?
bielas


3

Я використовую проект кутового шаблону Asp.Net Core з передньою частиною Angular 4 та веб-пакетом. Мені довелося використовувати '/ dist / assets / images /' перед назвою зображення та зберігати зображення в каталозі assets / images у каталозі dist. наприклад:

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

Але коли ви в розробці, це не спрацює правильно?
devN

2
@davaus, мабуть, тому, що ти вже зробив збірку, тож твій старий 'dist' просто сидить там. Якщо ви оновите зображення, воно не буде оновлюватися до моменту створення.
Simon_Weaver

Що має сенс. Дякую.
davaus

1

Просто помістіть свої зображення в папку активів, посилайтеся на них на своїх htmlсторінках або у tsфайлах із цим посиланням.


1

У angular лише одна сторінка вимагає від сервера, тобто index.html. А index.html та папка assets знаходяться в одному каталозі. вкладаючи зображення в будь-який компонент, надайте значення src, як assets\image.png. Це буде працювати нормально, оскільки браузер надсилатиме запит на сервер для цього зображення, і веб-пакет зможе обслуговувати це зображення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.