ChatGPT解决这个技术问题 Extra ChatGPT

如何在 Angular 项目中加载图像(和其他资产)?

我对 Angular 很陌生,所以我不确定这样做的最佳实践。

我使用 angular-cli 和 ng new some-project 生成了一个新应用。

在“资产”文件夹中创建了一个“图像”文件夹,所以现在我的图像文件夹是 src/assets/images

app.component.html(这是我的应用程序的根)中,我输入

<img class="img-responsive" src="assets/images/myimage.png">

当我执行 ng serve 查看我的网络应用程序时,图像不显示。

在 Angular 应用程序中加载图像的最佳实践是什么?

编辑:见下面的答案。我的实际图像名称使用了 Angular 不喜欢的空格。当我删除文件名中的空格时,图像正确显示。

是的,你是对的,你从资产文件夹中给出了正确的路径语法,可能是你的名字不匹配的问题,检查图像是否存在
绝对不是名称不匹配,我最终在 src 之外创建了一个 public 文件夹并使用 <img class="img-responsive" src="../../public/images/myimage.png"> 显示图像
解决它。我的实际图像文件名中有空格,无论出于何种原因,Angular 都不喜欢这样。当我从文件名中删除空格时,assets/images/myimage.png 起作用了。
好 :) 顺便说一句,不需要在更新的 cli 中创建额外的公用文件夹,它们已经具有相同的命名 asstes。
我对具有其他扩展名的文件(例如 .sgf)也有类似的问题 我想托管这些文件并从应用程序链接到它们,但显然只是将它们放在 assets 文件夹中是不够的。有任何想法吗 ?

m
mruanova

在我的项目中,我在 app.component.html 中使用以下语法:

<img src="/assets/img/1.jpg" alt="image">

或者

<img src='http://mruanova.com/img/1.jpg' alt='image'>

使用插值绑定属性时,使用 [src] 作为模板表达式:

<img [src]="imagePath" />

是相同的:

<img src={{imagePath}} />

来源:how to bind img src in angular 2 in ngFor?


您的 app.component.html 和 assets 文件夹在同一级别吗?
不,文件夹结构是自动创建的,您应该拥有与我相同的文件夹:project-folder\src\assets\ 和 project-folder\app\app.component.html 如果这有帮助,请点赞。
u
user3183717

我修好了它。我的实际图像文件名中有空格,无论出于何种原因,Angular 都不喜欢这样。当我从文件名中删除空格时,assets/images/myimage.png 起作用了。


我在文件名中有一个特殊字符'^'并且在重命名它之后遇到了同样的问题,所以我相信角度不喜欢文件名中的特殊字符和空格
j
jmuhire

默认情况下,Angular-cli 在构建选项中包含 assets 文件夹。当我的图像名称有空格或破折号时,我遇到了这个问题。例如 :

'my-image-name.png' 应该是 'myImageName.png'

'我的图片名称.png' 应该是 'myImageName.png'

如果您将图像放在 assets/img 文件夹中,那么这行代码应该可以在您的模板中使用:

<img alt="My image name" src="./assets/img/myImageName.png">

如果问题仍然存在,只需检查您的 Angular-cli 配置文件并确保您的资产文件夹已添加到构建选项中。


[alt] 对于字符串不是必需的, [] 用于数据绑定。
B
Bhuwan Maharjan

具体到 Angular2 到 5,我们可以使用属性绑定来绑定图像路径,如下所示。图片路径用单引号括起来。

示例示例

<img [src]="'assets/img/klogo.png'" alt="image">


src="assets/img/klogo.png" 和 [src]="'assets/img/klogo.png'" 有什么区别?
所以基本上,如果我们希望能够使用该方法更改 src,我们使用 [src] 绑定到模型。
感谢 mohit 回答问题。 @gdbj 我希望您现在已经解决了您的困惑。
只是想指出未来的读者在 gdbj 的第一条评论中寻找内部单引号。它们在评论字体中比在上面的答案中更难看到,但缺少它们可能会导致一些混乱。 (可能取决于您的浏览器,不确定。)
c
chrispy

通常,“app”是您的应用程序的根——您尝试过 app/path/to/assets/img.png 吗?


angular-cli 将 appassets 文件夹分别放在 src 文件夹下。 (对不起,我不确定我应该如何格式化文件夹结构和名称)
B
Bheem Singh

1.将此行添加到组件的顶部。

declare var require: any

2.在您的组件类中添加这一行。

imgname= require("../images/imgname.png");

在 html 页面上的 img src 标签中添加这个“imgname”。


这对于不平坦的文件层次结构树更好。
它还通过为图像生成哈希来解决缓存问题。这在 Angular 8 中完美运行,但在 Angular 9 中,我们需要访问默认属性。 imgname= require("../images/imgname.png").default; 这是老生常谈的方式。您知道导入图像的其他解决方案吗?版本升级后不应更改。
A
Anonymous Creator

对我来说,“我”是“图像”中的资本。这也是 angular-cli 不喜欢的。所以它也是区分大小写的。

像 IIS 这样的一些 Web 服务器没有问题,如果 Angular 应用程序托管在 IIS 中,区分大小写不是问题。


A
Anand Raja

您可以在 Angular 8+ 中按照以下步骤操作

第一步:在组件中加载如下图片

const logo = require('../assets/logo.svg').default as string;

@Component({
    selector: 'app-show-image',
    templateUrl: './app.component.html',
    styleUrls: ['./app.component.scss']
})
export class ShowImageComponent implements OnInit {

  logo = logo;
  constructor() { }
  ngOnInit() { }

}

第2步:在html文件中添加逻辑

<img [src]="logo" [alt]="'logo'">

如果在没有进一步配置的情况下启动,您将看到一个奇怪的错误:

ERROR in src/app/app.component.ts(4,14): error TS2580: Cannot find name 'require'. Do you need to install type definitions for node? Try `npm i @types/node` and then add `node` to the types field in your tsconfig.

按照建议进行操作 - 通过运行 npm install @types/node@types/node 类型添加到您的项目并编辑 tsconfig.app.json 以设置:

"compilerOptions": {
    "types": ["node"],
    ...
}

欲了解更多信息resource


使用 import 对我不起作用: import logoSvg from '../../assets/shared/logo.svg';它找不到类型及其声明
像上面所说的那样导入图像时出现此错误:src/app/header/header.component.ts:2:14 - 错误 TS2591:找不到名称“require”。您需要为节点安装类型定义吗?尝试 npm i --save-dev @types/node,然后将“节点”添加到 tsconfig 中的类型字段。 2 const logo = require('../assets/logo.svg').default 作为字符串;
您必须 install @types/node 并编辑 tsconfig.app.json 如下 "compilerOptions": { "types": ["node"], ... }
s
sznczy

它始终取决于引用静态资源(在本例中为图像)路径的 html 文件在哪里。

示例 A:

src
|__assests
   |__images
      |__myimage.png
|__yourmodule
   |__yourpage.html

如您所见,yourpage.html 与根目录(src 文件夹)相距一个文件夹,因此需要一定数量的 ../ 才能返回根目录,然后您可以从根目录走到图像:

<img class="img-responsive" src="../assests/images/myimage.png">

示例 B:

src
|__assests
   |__images
      |__myimage.png
|__yourmodule
   |__yoursubmodule
      |__yourpage.html

在这里,您必须通过 2 个文件夹进入树中:

<img class="img-responsive" src="../../assests/images/myimage.png">

默认情况下,Angular 将 src 文件夹与 app 和 assets 文件夹直接放在应该为实际应用程序保留的位置(所有 html、ts、css 文件)。我很好奇为什么你会将模块放在 src 文件夹之外,而不是在应用程序之外。我觉得这违反了文件结构的所有约定。
R
Raxsi

加载图像时尽量不要留空间。

代替

<img src='assets/img/myimage.png' alt="">     

尝试使用字符串插值或属性绑定来加载源图像作为最佳实践。