Javascript 相对路径中的角度2 img src

Javascript 相对路径中的角度2 img src,javascript,angular,Javascript,Angular,约翰帕帕角形2样式指南建议采用方法。我的想法是,你可以制作可以重复使用的独立小角度组件 所以,我制作了一个我想在另一个项目中重用的组件,并将其放在它自己的文件夹中。我还添加了一个图像,我希望这个组件显示在同一个文件夹中,所以它都是独立的 <img class="logo" src="logo.png"/> 因此,即使我使用path header/logo.png,它也不起作用。我必须做app/header/logo.png。这实际上是一个绝对路径,如果我添加一个前导斜杠:“/app

约翰帕帕角形2样式指南建议采用方法。我的想法是,你可以制作可以重复使用的独立小角度组件

所以,我制作了一个我想在另一个项目中重用的组件,并将其放在它自己的文件夹中。我还添加了一个图像,我希望这个组件显示在同一个文件夹中,所以它都是独立的

<img class="logo" src="logo.png"/>
因此,即使我使用path header/logo.png,它也不起作用。我必须做app/header/logo.png。这实际上是一个绝对路径,如果我添加一个前导斜杠:“/app/header/logo.png”,实际上也同样有效。任何小于完整路径的内容都会断开链接。这意味着,如果有人想重用它,他们必须拥有完全相同的文件夹结构


我想这就是它的工作原理,我只是在学习Angular 2,但在我看来,我应该能够从components文件夹中加载资产,就像我可以使用模板或css一样

我正在使用webpack,并且已经能够通过
将组件中的图像作为变量并在我的模板中使用它来克服这个问题

这是因为在捆绑阶段,webpack将加载资源并存储正确的URL,并且在运行时调用require将获得正确的URL以传递给模板


范例

使用以下目录结构

app/
    header/
        header.component.ts
        header.component.html
        assets/
            logo.png
...
标题.component.ts

...
@Component({
    selector: 'header',
    templateUrl: './header.component.html', // Auto required by webpack
})
export class HeaderComponent {
    private LOGO = require("./assets/logo.png");

    constructor() {};
}
...
declare var require: any;

@Component({
    selector: 'header',
    templateUrl: './header.component.html', // Auto required by webpack
})
export class HeaderComponent {
    private LOGO = require("./assets/logo.png");

    constructor() {};
}
header.component.html

<div>
    <img [src]="LOGO" />
</div>
<div>
    <img [src]="LOGO" />
</div>


诚然,这会绑定组件和模板,但需求需要在组件中,以便webpack能够在绑定时分析和加载它


通过这种方法,我使用npm打包了我的模块,并在另一个项目中安装和使用了它,该项目也使用了webpack


我还需要使用SystemJS进行测试。

使用根目录中包含徽标图像的资产文件夹

我将通过将src路径分为两部分来解决此问题,如下所示:

<img class="logo" [src]="(imgPath + imgFileName)" />

通过使用@Input()decorator,可以在外部看到imgPath变量,以便在将组件移动到另一个位置时,可以设置不同的路径,使组件可重用。

如果问题是404错误,则需要更改路径

从路径/图像(根/路径/图像/path/image等)

/path/image

然后,如果没有任何其他问题,它应该可以工作。

查看以下答案:


关键是将其放入“assets”文件夹,或者编辑“.angular cli.json”文件(assets部分),以包括图像所在的位置。对于应该提供的其他资源,也就是样式表,也是如此。

@David的解决方案有些过时,因为现在angular2可以升级,它适用于anular 2/3。对于angular 4及以上,它将抛出require not found错误,这就是我修改它的方式

标题.component.ts

...
@Component({
    selector: 'header',
    templateUrl: './header.component.html', // Auto required by webpack
})
export class HeaderComponent {
    private LOGO = require("./assets/logo.png");

    constructor() {};
}
...
declare var require: any;

@Component({
    selector: 'header',
    templateUrl: './header.component.html', // Auto required by webpack
})
export class HeaderComponent {
    private LOGO = require("./assets/logo.png");

    constructor() {};
}
header.component.html

<div>
    <img [src]="LOGO" />
</div>
<div>
    <img [src]="LOGO" />
</div>


Do absolute path以便您可以在任何地方使用它?只需添加获取图像所需的最小路径,因此如果它位于:component1/images/logo.png下,请写下:我已编辑了我的问题以进行澄清。这是关于如何使模块在其文件夹中自包含,而不必担心该文件夹在应用程序中的位置。这样,它就可以很容易地在其他项目中重用。然而,这似乎就是它现在应该如何工作。嗨,罗布,你解决过这个问题吗?这个答案帮助了我,它也应该对你有用
这很有趣,谢谢你发布这个。当我最初问这个问题的时候(差不多一年前的现在!),我并没有深入到网页中。我觉得这是一个很好的解决办法。今晚我要试试这个。它也适用于绝对路径和网页别名!!!这是最好的答案,我认为这是导入图像的最佳方式,因为您不必使用大量丑陋的:src=“.:/../../../../../../../../../../../finally my image.png”编写相对路径。无可否认,这是一个完美的解决方案,考虑到它可以处理网页包绑定,甚至可以从节点_模块访问图像。此解决方案非常完美,用法:
private logo=require('3rdPartyNodeModules/src/images/test.svg')
如果我没记错的话,它在AOT项目中可以正常工作。我必须做的更改是删除私有修饰符,因为ng编译器无法使用它。angular cli在引擎盖下使用Webpack,因此这里也应用了相同的require原则。你挽救了这一天。我尝试了50种不同的方法,包括
ControlValueAccessor
,但这一种效果很好。这篇文章质量很差,需要显著改进才能发挥作用。