Aurelia 中的图像源绑定
Image source binding in Aurelia
我想在 aurelia 组件中绑定 img
标签的 src
属性,我该怎么做?
我正在以这种方式在 reapeat.for
循环中创建一些图像:
<img repeat.for="picture of infoboard.memberPictures" src.bind="picture">
其中,memberPictures
数组来自视图模型,picture
的值为相对地址:../../../assets/pictures/img_avatar.png
.
在视图模型中,我从数据库中获取成员信息并通过处理数据,以这种方式填充 memberPictures
数组:
this.httpClient.fetch(`boards/membersof/${this.infoboard.id}`)
.then(response => response.json())
.then(data => {
this.infoboard.memberPictures = data.result.map(element => `../../../assets/pictures/${element.profile_pic}.png`);
});
这样绑定地址,图片加载不出来,像这样:
并且浏览器控制台显示以下错误:
img_avatar.png:1 GET http://localhost:8080/assets/pictures/img_avatar.png 404 (Not Found)
查看元素时,会员头像的图片标签是这样的:
<img src.bind="picture" class="au-target" au-target-id="10" src="../../../assets/pictures/img_avatar.png">
但是如果我们向图片源提供静态图片,其地址与上例中生成的地址完全相同,如下所示:
<img repeat.for="picture of infoboard.memberPictures" src.bind="../../../assets/pictures/img_avatar.png">
不会有问题的:
现在通过检查元素有不同的结果:
<img src="/a5e81f19cf2c587876fd1bb08ae0249f.png">
显然,aurelia 中处理静态文件的方式有所不同。图片源是怎么改成这样的,正确的绑定图片源的方法是什么?
这是因为您正在使用 webpack 来打包您的项目。
webpack 做的一件事是将所有静态文件(图像、字体等)打包到包中——然后用指向相同内容的不同 "url" 替换所有静态引用捆绑包中的资产。
在 运行 时间,您无法访问捆绑包外的内容。
顺便说一下,这就是我们需要对所有 aurelia 组件使用 PLATFORM.moduleName()
的原因,因为 webpack 默认情况下不会选择这些组件。
在您的例子中,您将 img
标签绑定到动态 url。 Webpack 没有任何方法可以将它们捆绑到输出包中,因为那些 url 是在 运行 时间生成的。
您需要使用 require
关键字才能在 运行 时使用
对于这样的目录结构:
export class App {
public urls:string[] = ["test", "t1", "t2", "t3"];
getUrl(name)
{
return require(`./assets/${name}.png`);
}
}
<template>
<img repeat.for="url of urls" src.bind="getUrl(url)">
</template>
编辑:
在您的情况下,只需使用:
this.httpClient.fetch(`boards/membersof/${this.infoboard.id}`)
.then(response => response.json())
.then(data => {
this.infoboard.memberPictures = data.result.map(element => require(`../../../assets/pictures/${element.profile_pic}.png`));
});
我想在 aurelia 组件中绑定 img
标签的 src
属性,我该怎么做?
我正在以这种方式在 reapeat.for
循环中创建一些图像:
<img repeat.for="picture of infoboard.memberPictures" src.bind="picture">
其中,memberPictures
数组来自视图模型,picture
的值为相对地址:../../../assets/pictures/img_avatar.png
.
在视图模型中,我从数据库中获取成员信息并通过处理数据,以这种方式填充 memberPictures
数组:
this.httpClient.fetch(`boards/membersof/${this.infoboard.id}`)
.then(response => response.json())
.then(data => {
this.infoboard.memberPictures = data.result.map(element => `../../../assets/pictures/${element.profile_pic}.png`);
});
这样绑定地址,图片加载不出来,像这样:
并且浏览器控制台显示以下错误:
img_avatar.png:1 GET http://localhost:8080/assets/pictures/img_avatar.png 404 (Not Found)
查看元素时,会员头像的图片标签是这样的:
<img src.bind="picture" class="au-target" au-target-id="10" src="../../../assets/pictures/img_avatar.png">
但是如果我们向图片源提供静态图片,其地址与上例中生成的地址完全相同,如下所示:
<img repeat.for="picture of infoboard.memberPictures" src.bind="../../../assets/pictures/img_avatar.png">
不会有问题的:
现在通过检查元素有不同的结果:
<img src="/a5e81f19cf2c587876fd1bb08ae0249f.png">
显然,aurelia 中处理静态文件的方式有所不同。图片源是怎么改成这样的,正确的绑定图片源的方法是什么?
这是因为您正在使用 webpack 来打包您的项目。
webpack 做的一件事是将所有静态文件(图像、字体等)打包到包中——然后用指向相同内容的不同 "url" 替换所有静态引用捆绑包中的资产。
在 运行 时间,您无法访问捆绑包外的内容。
顺便说一下,这就是我们需要对所有 aurelia 组件使用 PLATFORM.moduleName()
的原因,因为 webpack 默认情况下不会选择这些组件。
在您的例子中,您将 img
标签绑定到动态 url。 Webpack 没有任何方法可以将它们捆绑到输出包中,因为那些 url 是在 运行 时间生成的。
您需要使用 require
关键字才能在 运行 时使用
对于这样的目录结构:
export class App {
public urls:string[] = ["test", "t1", "t2", "t3"];
getUrl(name)
{
return require(`./assets/${name}.png`);
}
}
<template>
<img repeat.for="url of urls" src.bind="getUrl(url)">
</template>
编辑:
在您的情况下,只需使用:
this.httpClient.fetch(`boards/membersof/${this.infoboard.id}`)
.then(response => response.json())
.then(data => {
this.infoboard.memberPictures = data.result.map(element => require(`../../../assets/pictures/${element.profile_pic}.png`));
});