Angularjs 使用网页包加载ng src图像
我正在加载带有角度的图像,例如Angularjs 使用网页包加载ng src图像,angularjs,webpack,Angularjs,Webpack,我正在加载带有角度的图像,例如 <img ng-src="{{::path-to-image}}"/> webpack如何捆绑运行时解析的图像?如果您需要通过编程生成的图像路径,这意味着您有一些逻辑期望该图像存在。换言之,你应该把这个图像看作是一条逻辑的依赖关系,因此你需要明确地要求它。 在JS代码中(例如:控制器) 在模板中: <img ng-src="{{::myCtrl.imageUrl}}"/> Webpack足够智能,可以理解动态require语句,并绑
<img ng-src="{{::path-to-image}}"/>
webpack如何捆绑运行时解析的图像?如果您需要通过编程生成的图像路径,这意味着您有一些逻辑期望该图像存在。换言之,你应该把这个图像看作是一条逻辑的依赖关系,因此你需要明确地要求它。 在JS代码中(例如:控制器) 在模板中:
<img ng-src="{{::myCtrl.imageUrl}}"/>
Webpack足够智能,可以理解动态require
语句,并绑定与该表达式匹配的图像。
查看文档了解更多详细信息:)因为我也需要这些功能,发现原来的答案远非完美的解决方案,我最终自己找到了答案 在控制器中写入函数:
$scope.loadImage = function(image) {
return require('/images/' + image);
};
并在您的ng src中使用它:
<img ng-src="{{loadImage('myImage')}}" />
在这之后,要使动态需要工作,您可以使用
例如:
我创建了一个
uiImage
指令,需要这些图像
function uiImage() {
return {
restrict: 'A',
link: function(scope, element, attr) {
var src = attr.uiImage || attr.src;
function loadImage(image) {
return require(`Images/${image}`);
}
// required for webpack to pick up image
element.attr('src', loadImage(src));
}
};
}
uiImage.$inject = [];
export default uiImage;
用法:
<img ui-image='myimage.png' />
我需要在运行时使用webpack生成的哈希动态解析图像,例如,imgA.bd79a5ba.png
{
测试:/\.png$/,,
加载器:“文件加载器?名称=images/[name].[hash].[ext]',
}
我最终创建了一个alias模块,并需要以下图像:
let map = {
'imgA': require('./images/imgA.png'),
'imgB': require('./images/imgB.png'),
'imgC': require('./images/imgC.png')
}
这将生成地图:
{
'imgA': imgA.bd79a5ba.png,
'imgB': imgB.e51f66a2.png,
'imgC': imgC.d84ae37c.png
}
在我的组件中,我解析了地图中的url:
self.link = function link(scope) {
scope.imageUrl = function(name) {
function return map[name];
}
};
然后加载图像就变得很简单了:
<img ng-src="{{ imageUrl('imgA') }}">
然后将其导入组件模块:
import urlMap from './imageUrlMap'
console.log(urlMap.imgA)
> imgA.bd79a5ba.png
我只是使用CopyWebpackPlugin,没有任何开销
const CopyWebpackPlugin = require('copy-webpack-plugin');
// WriteFilePlugin needed only for webpack 3-4 and webpack dev-server
const WriteFilePlugin = require('write-file-webpack-plugin');
plugins: [
...
new WriteFilePlugin(),
new CopyWebpackPlugin([
{from: 'files', to: 'files'},
{from: 'images-2x', to: 'images-2x'},
{from: 'images', to: 'images'},
]),
]
您的建议将视图逻辑扩展到控制器中,而控制器以前不知道视图(html文件)是否和如何显示数据。对我来说,它更像是一个网页包限制,即它无法处理在运行时解决的资源。我想我会求助于gulp将我的静态资产复制到dist/文件夹。谢谢。事实上,我对此有复杂的感觉。但实际上Webpack可以处理它(如我所示,通过require()调用)。这更像是一个html加载程序限制,因为它没有考虑src(或ng src)属性中的角度表达式。还有一句话:通过依赖外部工具来复制/构建资产,您隐藏了代码(html)和图像之间的依赖关系。对我来说,这就像在全局范围中使用$(并期望它在那一点上已经定义),而不是使用var$=require('jquery')显式地要求它代码>我们不习惯这样认为这类资产(字体、图像、样式),但毕竟css和其他文件加载器是为之而设计的。我同意,但这又归结为加载器。如果将加载程序配置为散列文件内容,则无法在html中反映这一点。另一方面,我不想为静态和动态引用的图像配置不同的加载程序,以及其他开发人员的开销。这种类型的“全局”依赖关系使我的代码库和开发过程保持简单,而前缀是“:”?聪明的解决方案!谢谢你的分享,这对我来说真是太好了。再次感谢您错过了ng src
中的{{}}
,您是对的!谢谢你的反馈,我修复了它。为什么它与DOM有关?加载例如json文件或图像有什么区别?
<img ng-src="{{ imageUrl('imgA') }}">
export default {
'imgA': require('./images/imgA.png'),
'imgB': require('./images/imgB.png'),
'imgC': require('./images/imgC.png')
}
import urlMap from './imageUrlMap'
console.log(urlMap.imgA)
> imgA.bd79a5ba.png
const CopyWebpackPlugin = require('copy-webpack-plugin');
// WriteFilePlugin needed only for webpack 3-4 and webpack dev-server
const WriteFilePlugin = require('write-file-webpack-plugin');
plugins: [
...
new WriteFilePlugin(),
new CopyWebpackPlugin([
{from: 'files', to: 'files'},
{from: 'images-2x', to: 'images-2x'},
{from: 'images', to: 'images'},
]),
]